@manta-eu/react 0.8.0 → 0.9.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 (533) hide show
  1. package/dist/action-plan-changes/ActionPlanChangesTable.js +1 -1
  2. package/dist/action-plan-changes/build-change-tree.js.map +1 -1
  3. package/dist/ad-preview/AdPluralDisplay.js +1 -1
  4. package/dist/ad-preview/GoogleAdGroupAdSingularDisplay.js +1 -3
  5. package/dist/ad-preview/GoogleAdGroupAdSingularDisplay.js.map +1 -1
  6. package/dist/ad-preview/MetaAdPreview.js +1 -1
  7. package/dist/ad-preview/meta-ad-copy.d.ts.map +1 -1
  8. package/dist/ad-preview/meta-ad-model.js.map +1 -1
  9. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  10. package/dist/components/ad-preview/business-avatar.d.ts.map +1 -1
  11. package/dist/components/ad-preview/business-identity.d.ts.map +1 -1
  12. package/dist/components/ad-preview/business-info.d.ts.map +1 -1
  13. package/dist/components/ad-preview/facebook/carousel.d.ts.map +1 -1
  14. package/dist/components/ad-preview/facebook/constants.d.ts.map +1 -1
  15. package/dist/components/ad-preview/facebook/header.js +1 -1
  16. package/dist/components/ad-preview/facebook/instream-reels.d.ts.map +1 -1
  17. package/dist/components/ad-preview/facebook/marketplace.d.ts.map +1 -1
  18. package/dist/components/ad-preview/google/search.js +1 -1
  19. package/dist/components/ad-preview/instagram/feed.js +1 -1
  20. package/dist/components/ad-preview/instagram/search-result.d.ts.map +1 -1
  21. package/dist/components/ad-preview/use-scroll-navigation.d.ts.map +1 -1
  22. package/dist/components/ai-elements/conversation.js +1 -1
  23. package/dist/components/badge/index.d.ts.map +1 -1
  24. package/dist/components/badge/index.js +1 -1
  25. package/dist/components/banner/index.d.ts.map +1 -1
  26. package/dist/components/branding/MantaGridAnimation.js +1 -1
  27. package/dist/components/breadcrumbs/index.js +1 -1
  28. package/dist/components/button/index.d.ts.map +1 -1
  29. package/dist/components/calendar/index.js +2 -2
  30. package/dist/components/card/index.d.ts.map +1 -1
  31. package/dist/components/chart/ForecastEventCard.js +1 -1
  32. package/dist/components/chart/ForecastHoverCard.js +1 -1
  33. package/dist/components/chart/ForecastLegend.d.ts.map +1 -1
  34. package/dist/components/chart/ForecastLegend.js +10 -2
  35. package/dist/components/chart/ForecastLegend.js.map +1 -1
  36. package/dist/components/chart/annotations.d.ts.map +1 -1
  37. package/dist/components/chart/chart-colors.d.ts.map +1 -1
  38. package/dist/components/chart/chart-schemas.d.ts +599 -599
  39. package/dist/components/chart/chart-schemas.d.ts.map +1 -1
  40. package/dist/components/chart/chart-schemas.js.map +1 -1
  41. package/dist/components/chart/chart.js +1 -1
  42. package/dist/components/chart/forecast-model.d.ts +1 -1
  43. package/dist/components/chart/forecast-model.d.ts.map +1 -1
  44. package/dist/components/chart/forecast-model.js.map +1 -1
  45. package/dist/components/chart/forecast.d.ts.map +1 -1
  46. package/dist/components/chat/chat-input/index.d.ts +1 -1
  47. package/dist/components/chat/chat-input/index.js +1 -1
  48. package/dist/components/chat/chat-input-footer/index.js +1 -1
  49. package/dist/components/chat/chat-reasoning/index.js +1 -1
  50. package/dist/components/chat-view/Chat.js +3 -3
  51. package/dist/components/chat-view/FileMessagePart.js +1 -1
  52. package/dist/components/chat-view/GraphContextPanel.js +1 -1
  53. package/dist/components/chat-view/MessageItem.js +1 -1
  54. package/dist/components/command/index.d.ts +15 -15
  55. package/dist/components/command/index.d.ts.map +1 -1
  56. package/dist/components/command/index.js +1 -1
  57. package/dist/components/dropdown/index.js +1 -1
  58. package/dist/components/file-dropzone/index.d.ts +25 -0
  59. package/dist/components/file-dropzone/index.d.ts.map +1 -0
  60. package/dist/components/file-dropzone/index.js +70 -0
  61. package/dist/components/file-dropzone/index.js.map +1 -0
  62. package/dist/components/graph/AgentsGraphListRow.js +1 -1
  63. package/dist/components/input/ai-action-buttons.js +1 -1
  64. package/dist/components/input/input-date-range.js +1 -1
  65. package/dist/components/input/input-field.d.ts.map +1 -1
  66. package/dist/components/input/input-field.js +1 -1
  67. package/dist/components/input/textarea.d.ts.map +1 -1
  68. package/dist/components/input/textarea.js +2 -2
  69. package/dist/components/input-otp/index.d.ts +6 -6
  70. package/dist/components/input-otp/index.d.ts.map +1 -1
  71. package/dist/components/layouts/InstallPrompt.js +1 -1
  72. package/dist/components/layouts/KnowledgeGraphStartupGate.d.ts +1 -1
  73. package/dist/components/layouts/RouteLayout.js +1 -1
  74. package/dist/components/layouts/page/PageHeaderActions.js +1 -1
  75. package/dist/components/loader/index.d.ts.map +1 -1
  76. package/dist/components/manta-logo/index.d.ts.map +1 -1
  77. package/dist/components/modal/index.d.ts.map +1 -1
  78. package/dist/components/onboarding/SidebarSpotlight.js +1 -1
  79. package/dist/components/pill/index.d.ts.map +1 -1
  80. package/dist/components/planning/ActionPlanDetailView.js +1 -1
  81. package/dist/components/planning/ManualActionList.d.ts +1 -1
  82. package/dist/components/planning/PlanDetailFooter.js +1 -1
  83. package/dist/components/planning/plan-detail-utils.d.ts.map +1 -1
  84. package/dist/components/planning/plan-detail-utils.js +2 -0
  85. package/dist/components/planning/plan-detail-utils.js.map +1 -1
  86. package/dist/components/progress/index.d.ts.map +1 -1
  87. package/dist/components/radio/index.d.ts.map +1 -1
  88. package/dist/components/rdf-insights/CampaignPerformanceSummary.js +1 -1
  89. package/dist/components/rdf-insights/InsightCard.js +1 -1
  90. package/dist/components/rdf-insights/ProductProfitability.js +1 -1
  91. package/dist/components/rdf-insights/ProductSalesRanking.js +1 -1
  92. package/dist/components/rdf-insights/ProductVariantsTable.js +1 -1
  93. package/dist/components/rdf-insights/RoasBenchmark.js +1 -1
  94. package/dist/components/select/index.d.ts.map +1 -1
  95. package/dist/components/sheet/index.d.ts.map +1 -1
  96. package/dist/components/sidebar/company-picker.js +1 -1
  97. package/dist/components/sidebar/nav-menu.js +1 -1
  98. package/dist/components/skeleton/index.d.ts +4 -4
  99. package/dist/components/skeleton/index.d.ts.map +1 -1
  100. package/dist/components/status/index.d.ts.map +1 -1
  101. package/dist/components/table/index.d.ts.map +1 -1
  102. package/dist/components/table/index.js.map +1 -1
  103. package/dist/components/table/use-table-state.js.map +1 -1
  104. package/dist/components/table-skeleton/index.js +1 -1
  105. package/dist/components/tabs/index.d.ts.map +1 -1
  106. package/dist/components/thinking/index.d.ts.map +1 -1
  107. package/dist/components/toast/index.d.ts +1 -0
  108. package/dist/components/toast/index.d.ts.map +1 -1
  109. package/dist/components/toast/index.js +1 -0
  110. package/dist/components/toast/index.js.map +1 -1
  111. package/dist/components/tool-invocation-card/DefaultResultDisplay.js +1 -1
  112. package/dist/components/tool-invocation-card/ToolOutputRenderer.js +1 -1
  113. package/dist/components/tree-multi-select/tree-multi-select-rows.js.map +1 -1
  114. package/dist/datastore-picker/DatastoreRow.js +1 -1
  115. package/dist/easing.d.ts.map +1 -1
  116. package/dist/entity-tree/EntityRelationTree.js +1 -1
  117. package/dist/explain-fact/EntityChip.js +1 -1
  118. package/dist/explain-fact/conclusion/ConclusionSubtitle.js +1 -1
  119. package/dist/explain-fact/inspector/InspectorBindings.js +1 -1
  120. package/dist/explain-fact/inspector/SupportsSection.js +1 -1
  121. package/dist/explain-fact/proof-tree/ProofRowContent.js +1 -1
  122. package/dist/explain-fact/proof-tree/ProofRowValue.js +1 -1
  123. package/dist/globals.css +33 -0
  124. package/dist/graph/GraphContextPanel.js +1 -1
  125. package/dist/graph/GraphControls.d.ts +1 -1
  126. package/dist/graph/GraphControls.d.ts.map +1 -1
  127. package/dist/graph/GraphControls.js +1 -1
  128. package/dist/graph/GraphErrorBoundary.d.ts +1 -1
  129. package/dist/graph/GraphErrorBoundary.d.ts.map +1 -1
  130. package/dist/graph/NodeContextMenu.d.ts +1 -1
  131. package/dist/graph/NodeContextMenu.d.ts.map +1 -1
  132. package/dist/graph/NodeContextMenu.js +1 -1
  133. package/dist/graph/NodeDetailPanel/PropertyDiffView.js +1 -1
  134. package/dist/graph/NodeDetailPanel/TypeSummaryPanel.d.ts.map +1 -1
  135. package/dist/graph/NodeDetailPanel/TypeSummaryPanel.js.map +1 -1
  136. package/dist/graph/custom-nodes.d.ts +4 -4
  137. package/dist/graph/custom-nodes.d.ts.map +1 -1
  138. package/dist/graph/custom-nodes.js +1 -1
  139. package/dist/graph/graph-layout.js.map +1 -1
  140. package/dist/graph/graph-list-utils.js.map +1 -1
  141. package/dist/graph/graph-model.js.map +1 -1
  142. package/dist/graph/graph-store.js.map +1 -1
  143. package/dist/graph/nodes/AdsDailyReportTemplateView.d.ts +1 -1
  144. package/dist/graph/nodes/AdsDailyReportTemplateView.d.ts.map +1 -1
  145. package/dist/graph/nodes/AttioCallRecordingView.d.ts +1 -1
  146. package/dist/graph/nodes/AttioCallRecordingView.d.ts.map +1 -1
  147. package/dist/graph/nodes/AttioCompanyView.d.ts +1 -1
  148. package/dist/graph/nodes/AttioCompanyView.d.ts.map +1 -1
  149. package/dist/graph/nodes/AttioDealView.d.ts +1 -1
  150. package/dist/graph/nodes/AttioDealView.d.ts.map +1 -1
  151. package/dist/graph/nodes/AttioMeetingView.d.ts +1 -1
  152. package/dist/graph/nodes/AttioMeetingView.d.ts.map +1 -1
  153. package/dist/graph/nodes/AttioNoteView.d.ts +1 -1
  154. package/dist/graph/nodes/AttioNoteView.d.ts.map +1 -1
  155. package/dist/graph/nodes/AttioTaskView.d.ts +1 -1
  156. package/dist/graph/nodes/AttioTaskView.d.ts.map +1 -1
  157. package/dist/graph/nodes/BrandAssetAnalysisActionView.d.ts +1 -1
  158. package/dist/graph/nodes/BrandAssetAnalysisActionView.d.ts.map +1 -1
  159. package/dist/graph/nodes/BrandAssetAnalysisView.d.ts +1 -1
  160. package/dist/graph/nodes/BrandAssetAnalysisView.d.ts.map +1 -1
  161. package/dist/graph/nodes/BrandFontSuggestionView.d.ts +1 -1
  162. package/dist/graph/nodes/BrandFontSuggestionView.d.ts.map +1 -1
  163. package/dist/graph/nodes/BrandGuidelinesView.d.ts +1 -1
  164. package/dist/graph/nodes/BrandGuidelinesView.d.ts.map +1 -1
  165. package/dist/graph/nodes/ConnectedAccountCard.d.ts +1 -1
  166. package/dist/graph/nodes/ConnectedAccountCard.d.ts.map +1 -1
  167. package/dist/graph/nodes/CoresignalCompanyView.d.ts +1 -1
  168. package/dist/graph/nodes/CoresignalCompanyView.d.ts.map +1 -1
  169. package/dist/graph/nodes/CoresignalEmployeeView.d.ts +1 -1
  170. package/dist/graph/nodes/CoresignalEmployeeView.d.ts.map +1 -1
  171. package/dist/graph/nodes/CoresignalExperienceView.d.ts +1 -1
  172. package/dist/graph/nodes/CoresignalExperienceView.d.ts.map +1 -1
  173. package/dist/graph/nodes/CoresignalJobView.d.ts +1 -1
  174. package/dist/graph/nodes/CoresignalJobView.d.ts.map +1 -1
  175. package/dist/graph/nodes/CoresignalKeyExecutiveDepartureView.d.ts +1 -1
  176. package/dist/graph/nodes/CoresignalKeyExecutiveDepartureView.d.ts.map +1 -1
  177. package/dist/graph/nodes/EntityCardShell.d.ts +1 -1
  178. package/dist/graph/nodes/EntityCardShell.d.ts.map +1 -1
  179. package/dist/graph/nodes/Ga4DailyOverviewView.d.ts +1 -1
  180. package/dist/graph/nodes/Ga4DailyOverviewView.d.ts.map +1 -1
  181. package/dist/graph/nodes/Ga4FunnelEventCountView.d.ts +1 -1
  182. package/dist/graph/nodes/Ga4FunnelEventCountView.d.ts.map +1 -1
  183. package/dist/graph/nodes/Ga4TrafficSourceView.d.ts +1 -1
  184. package/dist/graph/nodes/Ga4TrafficSourceView.d.ts.map +1 -1
  185. package/dist/graph/nodes/GoogleAdGroupAdView.d.ts +1 -1
  186. package/dist/graph/nodes/GoogleAdGroupAdView.d.ts.map +1 -1
  187. package/dist/graph/nodes/GoogleAdGroupCriterionView.d.ts +1 -1
  188. package/dist/graph/nodes/GoogleAdGroupCriterionView.d.ts.map +1 -1
  189. package/dist/graph/nodes/GoogleAdGroupView.d.ts +1 -1
  190. package/dist/graph/nodes/GoogleAdGroupView.d.ts.map +1 -1
  191. package/dist/graph/nodes/GoogleCampaignBudgetView.d.ts +1 -1
  192. package/dist/graph/nodes/GoogleCampaignBudgetView.d.ts.map +1 -1
  193. package/dist/graph/nodes/GoogleCampaignCriterionView.d.ts +1 -1
  194. package/dist/graph/nodes/GoogleCampaignCriterionView.d.ts.map +1 -1
  195. package/dist/graph/nodes/GoogleCampaignInsightView.d.ts +1 -1
  196. package/dist/graph/nodes/GoogleCampaignInsightView.d.ts.map +1 -1
  197. package/dist/graph/nodes/GoogleCampaignView.d.ts +1 -1
  198. package/dist/graph/nodes/GoogleCampaignView.d.ts.map +1 -1
  199. package/dist/graph/nodes/GoogleCustomerClientView.d.ts +1 -1
  200. package/dist/graph/nodes/GoogleCustomerClientView.d.ts.map +1 -1
  201. package/dist/graph/nodes/GoogleCustomerView.d.ts +1 -1
  202. package/dist/graph/nodes/GoogleCustomerView.d.ts.map +1 -1
  203. package/dist/graph/nodes/GoogleSearchTermInsightView.d.ts +1 -1
  204. package/dist/graph/nodes/GoogleSearchTermInsightView.d.ts.map +1 -1
  205. package/dist/graph/nodes/LinkedinAdAccountView.d.ts +1 -1
  206. package/dist/graph/nodes/LinkedinAdAccountView.d.ts.map +1 -1
  207. package/dist/graph/nodes/MetaAdAccountActivityView.d.ts +1 -1
  208. package/dist/graph/nodes/MetaAdAccountActivityView.d.ts.map +1 -1
  209. package/dist/graph/nodes/MetaAdAccountView.d.ts +1 -1
  210. package/dist/graph/nodes/MetaAdAccountView.d.ts.map +1 -1
  211. package/dist/graph/nodes/MetaAdImageView.d.ts +1 -1
  212. package/dist/graph/nodes/MetaAdImageView.d.ts.map +1 -1
  213. package/dist/graph/nodes/MetaAdSetView.d.ts +1 -1
  214. package/dist/graph/nodes/MetaAdSetView.d.ts.map +1 -1
  215. package/dist/graph/nodes/MetaAdView.d.ts +1 -1
  216. package/dist/graph/nodes/MetaAdView.d.ts.map +1 -1
  217. package/dist/graph/nodes/MetaCampaignView.d.ts +1 -1
  218. package/dist/graph/nodes/MetaCampaignView.d.ts.map +1 -1
  219. package/dist/graph/nodes/MetaInsightView.d.ts +1 -1
  220. package/dist/graph/nodes/MetaInsightView.d.ts.map +1 -1
  221. package/dist/graph/nodes/RenderedTemplateView.d.ts +1 -1
  222. package/dist/graph/nodes/RenderedTemplateView.d.ts.map +1 -1
  223. package/dist/graph/nodes/SchemaActionView.d.ts +1 -1
  224. package/dist/graph/nodes/SchemaActionView.d.ts.map +1 -1
  225. package/dist/graph/nodes/ShopifyShopView.d.ts +1 -1
  226. package/dist/graph/nodes/ShopifyShopView.d.ts.map +1 -1
  227. package/dist/graph/nodes/SlackChannelView.d.ts +1 -1
  228. package/dist/graph/nodes/SlackChannelView.d.ts.map +1 -1
  229. package/dist/graph/nodes/SlackMessageView.d.ts +1 -1
  230. package/dist/graph/nodes/SlackMessageView.d.ts.map +1 -1
  231. package/dist/graph/nodes/SlackUserView.d.ts +1 -1
  232. package/dist/graph/nodes/SlackUserView.d.ts.map +1 -1
  233. package/dist/graph/nodes/SlackWorkspaceView.d.ts +1 -1
  234. package/dist/graph/nodes/SlackWorkspaceView.d.ts.map +1 -1
  235. package/dist/graph/nodes/attio-shared.d.ts +1 -1
  236. package/dist/graph/nodes/attio-shared.d.ts.map +1 -1
  237. package/dist/graph/nodes/attio-shared.js +1 -1
  238. package/dist/graph/nodes/brand-shared.d.ts.map +1 -1
  239. package/dist/graph/nodes/card-rows.js +1 -1
  240. package/dist/graph/nodes/google-campaign-utils.d.ts.map +1 -1
  241. package/dist/graph/nodes/insight-shared.d.ts +1 -1
  242. package/dist/graph/nodes/insight-shared.d.ts.map +1 -1
  243. package/dist/graph/special-nodes/BaseNode.d.ts +2 -2
  244. package/dist/graph/special-nodes/BaseNode.d.ts.map +1 -1
  245. package/dist/graph/special-nodes/BaseNode.js +1 -1
  246. package/dist/graph/special-nodes/DynamicNode.d.ts +1 -1
  247. package/dist/graph/special-nodes/DynamicNode.d.ts.map +1 -1
  248. package/dist/graph/special-nodes/EntityValueChip.js +1 -1
  249. package/dist/graph/special-nodes/GenericNode.d.ts +1 -1
  250. package/dist/graph/special-nodes/GenericNode.d.ts.map +1 -1
  251. package/dist/graph/special-nodes/GenericView.d.ts +1 -1
  252. package/dist/graph/special-nodes/GenericView.d.ts.map +1 -1
  253. package/dist/graph/special-nodes/NodeFrame.d.ts +1 -1
  254. package/dist/graph/special-nodes/NodeFrame.d.ts.map +1 -1
  255. package/dist/graph/special-nodes/NodeFrame.js +1 -1
  256. package/dist/graph/special-nodes/TypeSummaryNode.d.ts +1 -1
  257. package/dist/graph/special-nodes/TypeSummaryNode.d.ts.map +1 -1
  258. package/dist/graph/special-nodes/TypeSummaryNode.js +1 -1
  259. package/dist/graph/special-nodes/card-facts.js.map +1 -1
  260. package/dist/hooks/resolved-terms.d.ts +1 -0
  261. package/dist/hooks/resolved-terms.d.ts.map +1 -1
  262. package/dist/hooks/resolved-terms.js +2 -1
  263. package/dist/hooks/resolved-terms.js.map +1 -1
  264. package/dist/hooks/use-action-plans-list.d.ts.map +1 -1
  265. package/dist/hooks/use-action-plans-list.js.map +1 -1
  266. package/dist/hooks/use-activity-feed.js.map +1 -1
  267. package/dist/hooks/use-connection-problems.d.ts.map +1 -1
  268. package/dist/hooks/use-conversation-starters.d.ts +2 -2
  269. package/dist/hooks/use-entity-relations.d.ts.map +1 -1
  270. package/dist/hooks/use-entity.d.ts.map +1 -1
  271. package/dist/hooks/use-latest-rendered-template.d.ts.map +1 -1
  272. package/dist/hooks/use-manual-actions.d.ts.map +1 -1
  273. package/dist/hooks/use-manual-actions.js.map +1 -1
  274. package/dist/hooks/use-sparql-construct.d.ts +2 -0
  275. package/dist/hooks/use-sparql-construct.d.ts.map +1 -1
  276. package/dist/hooks/use-sparql-construct.js +2 -1
  277. package/dist/hooks/use-sparql-construct.js.map +1 -1
  278. package/dist/hooks/useActionGraph.d.ts.map +1 -1
  279. package/dist/hooks/useActionGraph.js.map +1 -1
  280. package/dist/hooks/useActionPlanDetail.d.ts +2 -2
  281. package/dist/hooks/useActionPlanDetail.d.ts.map +1 -1
  282. package/dist/hooks/useAuth.d.ts +1 -1
  283. package/dist/hooks/useAuth.d.ts.map +1 -1
  284. package/dist/hooks/useAuth.js +3 -1
  285. package/dist/hooks/useAuth.js.map +1 -1
  286. package/dist/hooks/useConversationGraphContext.js.map +1 -1
  287. package/dist/hooks/useConversations.js.map +1 -1
  288. package/dist/hooks/useDatastoreSelection.js.map +1 -1
  289. package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
  290. package/dist/index.d.ts +1 -0
  291. package/dist/index.d.ts.map +1 -1
  292. package/dist/index.js +1 -0
  293. package/dist/index.js.map +1 -1
  294. package/dist/lib/build-config.js.map +1 -1
  295. package/dist/lib/datastore-route-table.d.ts +3 -0
  296. package/dist/lib/datastore-route-table.d.ts.map +1 -1
  297. package/dist/lib/datastore-route-table.js +3 -0
  298. package/dist/lib/datastore-route-table.js.map +1 -1
  299. package/dist/lib/default-map.d.ts.map +1 -1
  300. package/dist/lib/default-map.js.map +1 -1
  301. package/dist/lib/hooks/{useChatUpload.d.ts → useFileUpload.d.ts} +3 -3
  302. package/dist/lib/hooks/{useChatUpload.d.ts.map → useFileUpload.d.ts.map} +1 -1
  303. package/dist/lib/hooks/{useChatUpload.js → useFileUpload.js} +2 -2
  304. package/dist/lib/hooks/{useChatUpload.js.map → useFileUpload.js.map} +1 -1
  305. package/dist/lib/merge-refs.d.ts.map +1 -1
  306. package/dist/lib/rdf/insights.js.map +1 -1
  307. package/dist/lib/structured-data/schema-converter.d.ts +2 -2
  308. package/dist/lib/structured-data/schema-converter.d.ts.map +1 -1
  309. package/dist/lib/structured-data/schema-converter.js.map +1 -1
  310. package/dist/lib/tanstack-query.js +1 -1
  311. package/dist/lib/tanstack-query.js.map +1 -1
  312. package/dist/lib/term-batcher.d.ts +3 -1
  313. package/dist/lib/term-batcher.d.ts.map +1 -1
  314. package/dist/lib/term-batcher.js +2 -2
  315. package/dist/lib/term-batcher.js.map +1 -1
  316. package/dist/lib/use-can-scroll.d.ts.map +1 -1
  317. package/dist/lib/use-color-palette.d.ts.map +1 -1
  318. package/dist/lib/use-toggle-set.js.map +1 -1
  319. package/dist/lib/utils.js +1 -1
  320. package/dist/ontology/OntologyTermText.js +1 -1
  321. package/dist/providers/ActiveChatProvider.d.ts +1 -1
  322. package/dist/providers/ActiveDatastoreProvider.js.map +1 -1
  323. package/dist/providers/ChatManagerProvider.js.map +1 -1
  324. package/dist/providers/commands/CommandContext.js +1 -1
  325. package/dist/routes/activity/components/ActivityTable.js +1 -1
  326. package/dist/routes/activity/detail/ActivityDetail.d.ts.map +1 -1
  327. package/dist/routes/activity/detail/ActivityDetail.js +1 -1
  328. package/dist/routes/activity/detail/ActivityStepsRail.js +1 -1
  329. package/dist/routes/activity/detail/ActivityTimeline.js +1 -1
  330. package/dist/routes/data-collection/index.d.ts +3 -0
  331. package/dist/routes/data-collection/index.d.ts.map +1 -0
  332. package/dist/routes/data-collection/index.js +43 -0
  333. package/dist/routes/data-collection/index.js.map +1 -0
  334. package/dist/routes/data-explorer/class-properties.js.map +1 -1
  335. package/dist/routes/data-explorer/class-relations.d.ts +2 -2
  336. package/dist/routes/data-explorer/components/DataExplorerLayout.d.ts.map +1 -1
  337. package/dist/routes/data-explorer/components/DataExplorerLayout.js +5 -2
  338. package/dist/routes/data-explorer/components/DataExplorerLayout.js.map +1 -1
  339. package/dist/routes/data-explorer/components/DetailHeader.js +1 -1
  340. package/dist/routes/data-explorer/components/DetailHeader.js.map +1 -1
  341. package/dist/routes/data-explorer/components/Rail.d.ts.map +1 -1
  342. package/dist/routes/data-explorer/components/Rail.js +3 -3
  343. package/dist/routes/data-explorer/components/Rail.js.map +1 -1
  344. package/dist/routes/data-explorer/components/SegmentBuilder.js +1 -1
  345. package/dist/routes/data-explorer/components/class-detail/ClassDetail.js +1 -1
  346. package/dist/routes/data-explorer/components/class-detail/CreateRecordAction.js +1 -1
  347. package/dist/routes/data-explorer/components/class-detail/Overview.js +1 -1
  348. package/dist/routes/data-explorer/components/ontology-coverage/CoverageNamespaceRail.js +1 -1
  349. package/dist/routes/data-explorer/components/ontology-coverage/CoverageSkeleton.js +1 -1
  350. package/dist/routes/data-explorer/components/record-detail/CreateAction.js +1 -1
  351. package/dist/routes/data-explorer/components/record-detail/RecordActions.d.ts.map +1 -1
  352. package/dist/routes/data-explorer/components/record-detail/RecordActions.js +12 -9
  353. package/dist/routes/data-explorer/components/record-detail/RecordActions.js.map +1 -1
  354. package/dist/routes/data-explorer/components/record-detail/RecordDetail.js +1 -1
  355. package/dist/routes/data-explorer/components/record-detail/RecordRefresh.d.ts +7 -0
  356. package/dist/routes/data-explorer/components/record-detail/RecordRefresh.d.ts.map +1 -0
  357. package/dist/routes/data-explorer/components/record-detail/RecordRefresh.js +104 -0
  358. package/dist/routes/data-explorer/components/record-detail/RecordRefresh.js.map +1 -0
  359. package/dist/routes/data-explorer/components/uploads/IngestRunsList.d.ts +8 -0
  360. package/dist/routes/data-explorer/components/uploads/IngestRunsList.d.ts.map +1 -0
  361. package/dist/routes/data-explorer/components/uploads/IngestRunsList.js +18 -0
  362. package/dist/routes/data-explorer/components/uploads/IngestRunsList.js.map +1 -0
  363. package/dist/routes/data-explorer/components/uploads/IngestStateStatus.d.ts +14 -0
  364. package/dist/routes/data-explorer/components/uploads/IngestStateStatus.d.ts.map +1 -0
  365. package/dist/routes/data-explorer/components/uploads/IngestStateStatus.js +33 -0
  366. package/dist/routes/data-explorer/components/uploads/IngestStateStatus.js.map +1 -0
  367. package/dist/routes/data-explorer/components/uploads/UploadedFilesList.d.ts +8 -0
  368. package/dist/routes/data-explorer/components/uploads/UploadedFilesList.d.ts.map +1 -0
  369. package/dist/routes/data-explorer/components/uploads/UploadedFilesList.js +34 -0
  370. package/dist/routes/data-explorer/components/uploads/UploadedFilesList.js.map +1 -0
  371. package/dist/routes/data-explorer/components/uploads/UploadsPages.d.ts +7 -0
  372. package/dist/routes/data-explorer/components/uploads/UploadsPages.d.ts.map +1 -0
  373. package/dist/routes/data-explorer/components/uploads/UploadsPages.js +35 -0
  374. package/dist/routes/data-explorer/components/uploads/UploadsPages.js.map +1 -0
  375. package/dist/routes/data-explorer/coverage.d.ts.map +1 -1
  376. package/dist/routes/data-explorer/index.d.ts +1 -0
  377. package/dist/routes/data-explorer/index.d.ts.map +1 -1
  378. package/dist/routes/data-explorer/index.js +1 -0
  379. package/dist/routes/data-explorer/index.js.map +1 -1
  380. package/dist/routes/data-explorer/namespaces.d.ts +4 -0
  381. package/dist/routes/data-explorer/namespaces.d.ts.map +1 -1
  382. package/dist/routes/data-explorer/namespaces.js +6 -1
  383. package/dist/routes/data-explorer/namespaces.js.map +1 -1
  384. package/dist/routes/data-explorer/sparql-client.js.map +1 -1
  385. package/dist/routes/data-explorer/uploads.d.ts +56 -0
  386. package/dist/routes/data-explorer/uploads.d.ts.map +1 -0
  387. package/dist/routes/data-explorer/uploads.js +140 -0
  388. package/dist/routes/data-explorer/uploads.js.map +1 -0
  389. package/dist/routes/datastores/components/DatastoreTableSkeleton.js +1 -1
  390. package/dist/routes/datastores/components/DatastoresToolbar.js +1 -1
  391. package/dist/routes/datastores/components/LinkUnlinkedDatastoreDialog.d.ts +1 -0
  392. package/dist/routes/datastores/components/LinkUnlinkedDatastoreDialog.d.ts.map +1 -1
  393. package/dist/routes/datastores/components/LinkUnlinkedDatastoreDialog.js +17 -10
  394. package/dist/routes/datastores/components/LinkUnlinkedDatastoreDialog.js.map +1 -1
  395. package/dist/routes/datastores/components/StatusBadge.d.ts +7 -8
  396. package/dist/routes/datastores/components/StatusBadge.d.ts.map +1 -1
  397. package/dist/routes/datastores/components/StatusBadge.js +17 -1
  398. package/dist/routes/datastores/components/StatusBadge.js.map +1 -1
  399. package/dist/routes/datastores/components/UnlinkedDatastoresPanel.js +1 -1
  400. package/dist/routes/datastores/flatten.d.ts +6 -1
  401. package/dist/routes/datastores/flatten.d.ts.map +1 -1
  402. package/dist/routes/datastores/flatten.js +37 -2
  403. package/dist/routes/datastores/flatten.js.map +1 -1
  404. package/dist/routes/datastores/hooks/useDatastoreColumns.d.ts +4 -2
  405. package/dist/routes/datastores/hooks/useDatastoreColumns.d.ts.map +1 -1
  406. package/dist/routes/datastores/hooks/useDatastoreColumns.js +9 -7
  407. package/dist/routes/datastores/hooks/useDatastoreColumns.js.map +1 -1
  408. package/dist/routes/datastores/index.d.ts.map +1 -1
  409. package/dist/routes/datastores/index.js +54 -19
  410. package/dist/routes/datastores/index.js.map +1 -1
  411. package/dist/routes/integrations/catalog-shape.js.map +1 -1
  412. package/dist/routes/integrations/components/ConnectionRow.js +1 -1
  413. package/dist/routes/integrations/components/ProviderLogo.d.ts.map +1 -1
  414. package/dist/routes/integrations/components/connect-forms/DashConnectForm.js.map +1 -1
  415. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.d.ts +3 -0
  416. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.d.ts.map +1 -0
  417. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js +38 -0
  418. package/dist/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.js.map +1 -0
  419. package/dist/routes/integrations/components/connect-forms/MetaAdsConnectForm.js.map +1 -1
  420. package/dist/routes/integrations/components/connect-forms/MicrosoftAdsConnectForm.js.map +1 -1
  421. package/dist/routes/integrations/components/connect-forms/google-ads-account-tree.js.map +1 -1
  422. package/dist/routes/integrations/components/connect-forms/google-analytics-property-tree.js.map +1 -1
  423. package/dist/routes/integrations/components/connect-forms/google-merchant-center-account-tree.d.ts +4 -0
  424. package/dist/routes/integrations/components/connect-forms/google-merchant-center-account-tree.d.ts.map +1 -0
  425. package/dist/routes/integrations/components/connect-forms/google-merchant-center-account-tree.js +32 -0
  426. package/dist/routes/integrations/components/connect-forms/google-merchant-center-account-tree.js.map +1 -0
  427. package/dist/routes/integrations/components/connect-forms/setup-account-unavailable-reason.d.ts.map +1 -1
  428. package/dist/routes/integrations/components/connect-forms/setup-account-unavailable-reason.js +1 -0
  429. package/dist/routes/integrations/components/connect-forms/setup-account-unavailable-reason.js.map +1 -1
  430. package/dist/routes/integrations/connect-forms.d.ts +1 -0
  431. package/dist/routes/integrations/connect-forms.d.ts.map +1 -1
  432. package/dist/routes/integrations/connect-forms.js +1 -0
  433. package/dist/routes/integrations/connect-forms.js.map +1 -1
  434. package/dist/routes/integrations/connection-view.d.ts.map +1 -1
  435. package/dist/routes/integrations/connection-view.js +1 -0
  436. package/dist/routes/integrations/connection-view.js.map +1 -1
  437. package/dist/routes/integrations/types.d.ts.map +1 -1
  438. package/dist/routes/memories/components/ChangeScopeDialog.js +1 -1
  439. package/dist/routes/memories/components/ConflictMemoryCard.js +1 -1
  440. package/dist/routes/memories/components/ConsolidationReviewDialog.js +1 -1
  441. package/dist/routes/memories/components/LoadingSkeleton.js +1 -1
  442. package/dist/routes/memories/components/MemoriesFilters.js +1 -1
  443. package/dist/routes/memories/components/MemoriesTabPanel.js +1 -1
  444. package/dist/routes/memories/components/MemoryActions.js +1 -1
  445. package/dist/routes/memories/components/MemoryFields.js +1 -1
  446. package/dist/routes/memories/components/MemoryFormDialog.js +1 -1
  447. package/dist/routes/memories/expiry-utils.js.map +1 -1
  448. package/dist/routes/memories/hooks/useDuplicateDetection.js.map +1 -1
  449. package/dist/routes/memories/hooks/useLiveContext.d.ts.map +1 -1
  450. package/dist/routes/memories/hooks/useMemoryColumns.d.ts.map +1 -1
  451. package/dist/routes/memories/hooks/useMemoryColumns.js +1 -1
  452. package/dist/routes/memories/hooks/useMemoryTable.js.map +1 -1
  453. package/dist/routes/plans/components/ActionPlanPage.js +1 -1
  454. package/dist/routes/plans/components/ActionPlansFilters.js +1 -1
  455. package/dist/routes/plans/components/ActionPlansPage.js +1 -1
  456. package/dist/routes/plans/components/ActionPlansTableBody.js +1 -1
  457. package/dist/routes/plans/components/actionPlansTableConfig.d.ts +7 -7
  458. package/dist/routes/plans/components/actionPlansTableConfig.d.ts.map +1 -1
  459. package/dist/routes/plans/index.js +1 -1
  460. package/dist/routes/rules/components/RuleAffectedActionPlansSection.js +1 -1
  461. package/dist/routes/rules/components/RuleDetailsPage.js +1 -1
  462. package/dist/routes/rules/components/RuleProducersSection.js +1 -1
  463. package/dist/routes/rules/components/RuleSetup.js +1 -1
  464. package/dist/routes/rules/components/RulesOverviewPage.js +1 -1
  465. package/dist/routes/rules/components/datalog-editor/FactsPreview.js +1 -1
  466. package/dist/routes/rules/components/datalog-editor/SparqlQueryPanel.js +1 -1
  467. package/dist/routes/rules/components/rule-actionability.js.map +1 -1
  468. package/dist/rules/RuleNarrativeSegments.js +1 -1
  469. package/dist/rules/datalog-ast/DatalogAtomComponent.js +1 -1
  470. package/dist/rules/datalog-ast/DatalogBodyFormulaComponent.js +1 -1
  471. package/dist/rules/datalog-ast/DatalogExpressionRenderer.js +1 -1
  472. package/dist/rules/datalog-ast/DatalogTermComponent.js +1 -1
  473. package/dist/rules/datalog-cache.js.map +1 -1
  474. package/dist/rules/rule-narrative-format.d.ts.map +1 -1
  475. package/dist/rules/rule-narrative-renderer.js.map +1 -1
  476. package/dist/shared/graph-derived-queries.d.ts.map +1 -1
  477. package/dist/shared/graph-derived-queries.js +2 -1
  478. package/dist/shared/graph-derived-queries.js.map +1 -1
  479. package/dist/style.js +1 -1
  480. package/dist/templates/slack-to-markdown.js +1 -1
  481. package/package.json +27 -14
  482. package/src/app-subpaths.json +1 -0
  483. package/src/components/badge/index.tsx +1 -1
  484. package/src/components/calendar/index.tsx +2 -2
  485. package/src/components/chart/ForecastLegend.tsx +15 -13
  486. package/src/components/chart/forecast-model.ts +6 -8
  487. package/src/components/chat-view/Chat.tsx +2 -2
  488. package/src/components/file-dropzone/index.tsx +165 -0
  489. package/src/components/input/input-field.tsx +1 -1
  490. package/src/components/input/textarea.tsx +1 -1
  491. package/src/components/planning/plan-detail-utils.tsx +2 -0
  492. package/src/components/table/index.tsx +0 -1
  493. package/src/components/toast/index.tsx +1 -0
  494. package/src/graph/NodeDetailPanel/TypeSummaryPanel.tsx +12 -14
  495. package/src/hooks/resolved-terms.ts +6 -1
  496. package/src/hooks/use-sparql-construct.ts +4 -2
  497. package/src/hooks/useAuth.ts +3 -1
  498. package/src/index.ts +1 -0
  499. package/src/lib/chat-types.ts +1 -1
  500. package/src/lib/datastore-route-table.ts +6 -0
  501. package/src/lib/hooks/{useChatUpload.ts → useFileUpload.ts} +2 -2
  502. package/src/lib/tanstack-query.ts +2 -2
  503. package/src/lib/term-batcher.ts +3 -3
  504. package/src/lib/utils.ts +1 -1
  505. package/src/routes/data-collection/index.tsx +82 -0
  506. package/src/routes/data-explorer/components/DataExplorerLayout.tsx +5 -2
  507. package/src/routes/data-explorer/components/DetailHeader.tsx +4 -4
  508. package/src/routes/data-explorer/components/Rail.tsx +13 -2
  509. package/src/routes/data-explorer/components/record-detail/RecordActions.tsx +22 -16
  510. package/src/routes/data-explorer/components/record-detail/RecordRefresh.tsx +150 -0
  511. package/src/routes/data-explorer/components/uploads/IngestRunsList.tsx +63 -0
  512. package/src/routes/data-explorer/components/uploads/IngestStateStatus.tsx +45 -0
  513. package/src/routes/data-explorer/components/uploads/UploadedFilesList.tsx +93 -0
  514. package/src/routes/data-explorer/components/uploads/UploadsPages.tsx +80 -0
  515. package/src/routes/data-explorer/index.tsx +6 -0
  516. package/src/routes/data-explorer/namespaces.ts +7 -1
  517. package/src/routes/data-explorer/uploads.ts +205 -0
  518. package/src/routes/datastores/components/LinkUnlinkedDatastoreDialog.tsx +49 -10
  519. package/src/routes/datastores/components/StatusBadge.tsx +22 -7
  520. package/src/routes/datastores/flatten.ts +50 -2
  521. package/src/routes/datastores/hooks/useDatastoreColumns.tsx +21 -1
  522. package/src/routes/datastores/index.tsx +64 -13
  523. package/src/routes/integrations/components/connect-forms/GoogleMerchantCenterConnectForm.tsx +61 -0
  524. package/src/routes/integrations/components/connect-forms/google-merchant-center-account-tree.ts +38 -0
  525. package/src/routes/integrations/components/connect-forms/setup-account-unavailable-reason.ts +1 -0
  526. package/src/routes/integrations/connect-forms.ts +1 -0
  527. package/src/routes/integrations/connection-view.ts +1 -0
  528. package/src/rules/datalog-ast/DatalogBodyFormulaComponent.tsx +1 -1
  529. package/src/rules/datalog-ast/DatalogTermComponent.tsx +1 -1
  530. package/src/shacl/shacl-form-types.ts +1 -1
  531. package/src/shared/graph-derived-queries.ts +2 -0
  532. package/src/style.ts +1 -1
  533. package/src/templates/slack-to-markdown.ts +1 -1
@@ -104,14 +104,12 @@ export function buildForecastModel(input: ModelInput) {
104
104
  config: Object.fromEntries(
105
105
  [...metrics, ...withPlans.map((entry) => entry.without)].map((line) => [line.key, { label: line.label }]),
106
106
  ) satisfies ChartConfig,
107
- hoverMetrics: metrics.map(
108
- (metric): ForecastHoverMetric => ({
109
- key: metric.key,
110
- label: metric.label,
111
- lowerIsBetter: metric.lowerIsBetter === true,
112
- ...(isPresent(metric.withoutPlans) ? { withoutKey: metric.withoutPlans.key } : {}),
113
- }),
114
- ),
107
+ hoverMetrics: metrics.map((metric): ForecastHoverMetric => ({
108
+ key: metric.key,
109
+ label: metric.label,
110
+ lowerIsBetter: metric.lowerIsBetter === true,
111
+ ...(isPresent(metric.withoutPlans) ? { withoutKey: metric.withoutPlans.key } : {}),
112
+ })),
115
113
  legendItems: forecastLegendItems({
116
114
  metrics: metrics.map((metric, index) => ({ label: metric.label, color: metricColor(metric, index) })),
117
115
  withoutLabels: withPlans.map((entry) => entry.without.label),
@@ -50,7 +50,7 @@ import { useSelectedModel } from "#hooks/useSelectedModel";
50
50
  import { isDevBuild } from "#lib/build-config";
51
51
  import type { ChatDraft, CopilotMenuDefaults, Datastore, PageContext, User } from "#lib/chat-types";
52
52
  import { findLatestShowcase } from "#lib/find-latest-showcase";
53
- import { useChatUpload } from "#lib/hooks/useChatUpload";
53
+ import { useFileUpload } from "#lib/hooks/useFileUpload";
54
54
  import { planStatusLabel } from "#lib/plan-status-label";
55
55
  import { cn } from "#lib/utils";
56
56
  import { ActiveChatProvider, useActiveChatConnection } from "#providers/ActiveChatProvider";
@@ -360,7 +360,7 @@ function ChatContent(props: ChatContentProps) {
360
360
 
361
361
  const toolsUsedInSession = useRef(new Set<string>());
362
362
 
363
- const { uploadFiles, isUploading, progress: uploadProgress } = useChatUpload();
363
+ const { uploadFiles, isUploading, progress: uploadProgress } = useFileUpload();
364
364
 
365
365
  const beginAssistantTurn = useCallback(() => {
366
366
  turnKeyRef.current += 1;
@@ -0,0 +1,165 @@
1
+ import { maxUploadBytes } from "@manta-eu/client/shared/upload";
2
+ import { fileIdentityKey } from "@manta-eu/lib/file";
3
+ import { humanBytes } from "@manta-eu/lib/humanize";
4
+ import { isPresent } from "@manta-eu/lib/present";
5
+ import { FileText, UploadCloud } from "lucide-react";
6
+ import { useRef, useState, type ChangeEvent, type DragEvent } from "react";
7
+ import { Progress } from "#components/progress/index";
8
+ import { cn } from "#style";
9
+
10
+ export type RejectedDrop = {
11
+ file: File;
12
+ reason: string;
13
+ };
14
+
15
+ export function partitionDroppedFiles(files: readonly File[], maxFileSize: number) {
16
+ const accepted: File[] = [];
17
+ const rejected: RejectedDrop[] = [];
18
+
19
+ for (const file of files) {
20
+ if (file.size === 0) rejected.push({ file, reason: "File is empty" });
21
+ else if (file.size > maxFileSize) rejected.push({ file, reason: `File exceeds ${humanBytes(maxFileSize)}` });
22
+ else accepted.push(file);
23
+ }
24
+
25
+ return { accepted, rejected };
26
+ }
27
+
28
+ function hasFiles(dataTransfer: DataTransfer | null) {
29
+ return dataTransfer?.types.includes("Files") ?? false;
30
+ }
31
+
32
+ export type FileDropzoneProps = {
33
+ onFiles: (files: File[]) => void;
34
+ onRejected?: (rejected: RejectedDrop[]) => void;
35
+ disabled?: boolean;
36
+ maxFileSize?: number;
37
+ title?: string;
38
+ description?: string;
39
+ className?: string;
40
+ };
41
+
42
+ export function FileDropzone(props: FileDropzoneProps) {
43
+ const {
44
+ onFiles,
45
+ onRejected,
46
+ disabled = false,
47
+ maxFileSize = maxUploadBytes,
48
+ title = "Drop files here",
49
+ description,
50
+ className,
51
+ } = props;
52
+
53
+ const inputRef = useRef<HTMLInputElement>(null);
54
+ const [isDragging, setIsDragging] = useState(false);
55
+
56
+ function handleFiles(files: File[]) {
57
+ const { accepted, rejected } = partitionDroppedFiles(files, maxFileSize);
58
+
59
+ if (isPresent(rejected)) onRejected?.(rejected);
60
+ if (isPresent(accepted)) onFiles(accepted);
61
+ }
62
+
63
+ function handleDragOver(event: DragEvent<HTMLButtonElement>) {
64
+ if (disabled || !hasFiles(event.dataTransfer)) return;
65
+
66
+ event.preventDefault();
67
+ setIsDragging(true);
68
+ }
69
+
70
+ function handleDragLeave(event: DragEvent<HTMLButtonElement>) {
71
+ if (event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget)) return;
72
+
73
+ setIsDragging(false);
74
+ }
75
+
76
+ function handleDrop(event: DragEvent<HTMLButtonElement>) {
77
+ event.preventDefault();
78
+ setIsDragging(false);
79
+
80
+ if (disabled) return;
81
+
82
+ handleFiles(Array.from(event.dataTransfer.files));
83
+ }
84
+
85
+ function handleChange(event: ChangeEvent<HTMLInputElement>) {
86
+ handleFiles(Array.from(event.target.files ?? []));
87
+ event.target.value = "";
88
+ }
89
+
90
+ return (
91
+ <>
92
+ <button
93
+ type="button"
94
+ disabled={disabled}
95
+ onClick={() => inputRef.current?.click()}
96
+ onDragEnter={handleDragOver}
97
+ onDragOver={handleDragOver}
98
+ onDragLeave={handleDragLeave}
99
+ onDrop={handleDrop}
100
+ data-dragging={isDragging}
101
+ className={cn(
102
+ "flex min-h-56 w-full flex-col items-center justify-center gap-3 rounded-3xl border-2 border-dashed px-6 py-10",
103
+ "border-muted-border bg-faint text-center outline-none transition-colors",
104
+ "hover:border-accent-foreground/60 focus-visible:ring-2 focus-visible:ring-active-border/50",
105
+ "disabled:cursor-not-allowed disabled:opacity-60",
106
+ isDragging && "border-accent-foreground/80 bg-accent-foreground/[0.04]",
107
+ className,
108
+ )}
109
+ >
110
+ <UploadCloud className="size-8 text-accent-foreground" />
111
+ <span className="typography-body-medium text-default-foreground">{title}</span>
112
+ <span className="typography-small text-muted-foreground">
113
+ or <span className="text-primary underline underline-offset-2">browse your computer</span>
114
+ </span>
115
+ <span className="typography-caption text-muted-foreground">
116
+ {description ?? `Any file type, up to ${humanBytes(maxFileSize)} each`}
117
+ </span>
118
+ </button>
119
+
120
+ <input
121
+ ref={inputRef}
122
+ type="file"
123
+ multiple
124
+ hidden
125
+ disabled={disabled}
126
+ onChange={handleChange}
127
+ data-testid="file-dropzone-input"
128
+ />
129
+ </>
130
+ );
131
+ }
132
+
133
+ export type UploadProgressListProps = {
134
+ files: readonly File[];
135
+ progress: Record<string, number>;
136
+ className?: string;
137
+ };
138
+
139
+ export function UploadProgressList(props: UploadProgressListProps) {
140
+ const { files, progress, className } = props;
141
+
142
+ if (!isPresent(files)) return null;
143
+
144
+ return (
145
+ <ul className={cn("flex flex-col gap-2", className)} aria-label="Uploads in progress">
146
+ {files.map((file) => {
147
+ const percent = progress[fileIdentityKey(file)] ?? 0;
148
+
149
+ return (
150
+ <li
151
+ key={fileIdentityKey(file)}
152
+ className="flex items-center gap-3 rounded-lg border border-muted-border px-3 py-2"
153
+ >
154
+ <FileText className="size-4 shrink-0 text-muted-foreground" />
155
+ <span className="typography-small min-w-0 flex-1 truncate text-default-foreground">{file.name}</span>
156
+ <Progress value={percent} size="sm" className="w-24 shrink-0 sm:w-40" aria-label={`${file.name} upload`} />
157
+ <span className="typography-caption w-10 shrink-0 text-right tabular-nums text-muted-foreground">
158
+ {percent}%
159
+ </span>
160
+ </li>
161
+ );
162
+ })}
163
+ </ul>
164
+ );
165
+ }
@@ -170,7 +170,7 @@ export const Input = React.forwardRef<HTMLInputElement, InputArgs>(function Inpu
170
170
  inputRef.current.value = next;
171
171
  setInternalCount(next.length);
172
172
  onChange?.({ target: inputRef.current } as ChangeEvent<HTMLInputElement>);
173
- // eslint-disable-next-line no-useless-catch
173
+ // oxlint-disable-next-line no-useless-catch
174
174
  } catch (error) {
175
175
  throw error;
176
176
  } finally {
@@ -178,7 +178,7 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaArgs>(func
178
178
  textareaRef.current.value = next;
179
179
  setInternalCount(next.length);
180
180
  onChange?.({ target: textareaRef.current } as ChangeEvent<HTMLTextAreaElement>);
181
- // eslint-disable-next-line no-useless-catch
181
+ // oxlint-disable-next-line no-useless-catch
182
182
  } catch (error) {
183
183
  throw error;
184
184
  } finally {
@@ -109,6 +109,7 @@ export function formatIntegration(integration: GQLIntegration | null): string {
109
109
  .with(GQLIntegration.Meta, () => "Meta")
110
110
  .with(GQLIntegration.Google, () => "Google")
111
111
  .with(GQLIntegration.GoogleAnalytics, () => "Google Analytics")
112
+ .with(GQLIntegration.GoogleMerchantCenter, () => "Merchant Center")
112
113
  .with(GQLIntegration.Linkedin, () => "LinkedIn")
113
114
  .with(GQLIntegration.MicrosoftAds, () => "Microsoft Ads")
114
115
  .with(GQLIntegration.Shopify, () => "Shopify")
@@ -126,6 +127,7 @@ export function integrationToChannel(integration: GQLIntegration): Channel | nul
126
127
  [GQLIntegration.Meta]: "META",
127
128
  [GQLIntegration.Google]: "GOOGLE_ADS",
128
129
  [GQLIntegration.GoogleAnalytics]: null,
130
+ [GQLIntegration.GoogleMerchantCenter]: null,
129
131
  [GQLIntegration.Linkedin]: null,
130
132
  [GQLIntegration.MicrosoftAds]: null,
131
133
  [GQLIntegration.Shopify]: "SHOPIFY",
@@ -120,7 +120,6 @@ export enum SortingHandlerPlacement {
120
120
  }
121
121
 
122
122
  declare module "@tanstack/react-table" {
123
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
124
123
  interface ColumnMeta<TData, TValue> {
125
124
  /**
126
125
  * Placement of the sorting handler relative to the cell header
@@ -71,3 +71,4 @@ const Toaster = ({ className, ...props }: ToasterProps) => {
71
71
  };
72
72
 
73
73
  export { Toaster };
74
+ export { toast } from "sonner";
@@ -107,20 +107,18 @@ function buildInstanceColumns(args: BuildInstanceColumnsArgs): ColumnDef<SampleI
107
107
  }
108
108
 
109
109
  columns.push(
110
- ...previewKeys.map(
111
- (key): ColumnDef<SampleInstance> => ({
112
- id: `preview:${key}`,
113
- header: titleCase(key),
114
- meta: denseCellMeta,
115
- cell: ({ row }) => {
116
- const value = propertyValue(row.original, key);
117
- if (!isPresent(value)) return null;
118
- return (
119
- <span className="typography-tiny block truncate text-muted-foreground">{formatDisplayValue(value)}</span>
120
- );
121
- },
122
- }),
123
- ),
110
+ ...previewKeys.map((key): ColumnDef<SampleInstance> => ({
111
+ id: `preview:${key}`,
112
+ header: titleCase(key),
113
+ meta: denseCellMeta,
114
+ cell: ({ row }) => {
115
+ const value = propertyValue(row.original, key);
116
+ if (!isPresent(value)) return null;
117
+ return (
118
+ <span className="typography-tiny block truncate text-muted-foreground">{formatDisplayValue(value)}</span>
119
+ );
120
+ },
121
+ })),
124
122
  );
125
123
 
126
124
  return columns;
@@ -4,6 +4,7 @@ import { createTermBatcher, type TermBatcher } from "../lib/term-batcher";
4
4
  export type ResolvedTerms<T> = {
5
5
  values: Map<string, T>;
6
6
  request: (iris: string[]) => void;
7
+ refresh?: (iris: string[]) => void;
7
8
  // IRIs whose lookup has completed, found or not. Absent in static contexts
8
9
  // (tests), which are treated as already settled.
9
10
  settledIris?: ReadonlySet<string>;
@@ -137,6 +138,10 @@ export function useResolvedTermsState<T>(
137
138
  }, [batcher]);
138
139
 
139
140
  const request = useCallback((iris: string[]) => batcher.request(iris), [batcher]);
141
+ const refresh = useCallback((iris: string[]) => batcher.request(iris, { force: true }), [batcher]);
140
142
 
141
- return useMemo(() => ({ values, request, settledIris, failedIris }), [values, request, settledIris, failedIris]);
143
+ return useMemo(
144
+ () => ({ values, request, refresh, settledIris, failedIris }),
145
+ [values, request, refresh, settledIris, failedIris],
146
+ );
142
147
  }
@@ -1,4 +1,4 @@
1
- import { keepPreviousData, useQuery } from "@tanstack/react-query";
1
+ import { keepPreviousData, useQuery, type Query } from "@tanstack/react-query";
2
2
  import type { QueryContext } from "ldkit";
3
3
  import type { RDF } from "ldkit/rdf";
4
4
  import { withAbortSignal } from "../engine";
@@ -39,10 +39,11 @@ export type UseSparqlSelectOptions = {
39
39
  queryKey: readonly unknown[];
40
40
  enabled?: boolean;
41
41
  staleTime?: number;
42
+ refetchInterval?: number | false | ((query: Query<RDF.Bindings[]>) => number | false | undefined);
42
43
  };
43
44
 
44
45
  export function useSparqlSelect(config: UseSparqlSelectOptions) {
45
- const { query, queryKey, enabled = true, staleTime } = config;
46
+ const { query, queryKey, enabled = true, staleTime, refetchInterval } = config;
46
47
  const engine = useSparqlEngine();
47
48
  const options = useSparqlOptions();
48
49
 
@@ -54,5 +55,6 @@ export function useSparqlSelect(config: UseSparqlSelectOptions) {
54
55
  },
55
56
  enabled: enabled && !!query,
56
57
  staleTime,
58
+ refetchInterval,
57
59
  });
58
60
  }
@@ -1,4 +1,5 @@
1
1
  import { SessionContextDocument } from "@manta-eu/client";
2
+ import { loginStatusPollMs } from "@manta-eu/client/shared/constants";
2
3
  import { datastoreHeader } from "@manta-eu/client/shared/datastore-path";
3
4
  import { createHttpError, isHttpError } from "@manta-eu/client/shared/error-utils";
4
5
  import { isValidModelId, type MantaModelId } from "@manta-eu/client/shared/model";
@@ -189,7 +190,8 @@ export function useAuth(): UseAuthResult {
189
190
  // Keycloak's SSO session idle timeout (default 30 min) only resets when a request
190
191
  // actually reaches processMiddleware. A long WS-only chat session with no other HTTP
191
192
  // traffic would otherwise let the underlying session go idle and die silently.
192
- refetchInterval: 5 * 60 * 1000,
193
+ // The poll also renews the access token before it expires, so it must run more often than the token lives.
194
+ refetchInterval: loginStatusPollMs,
193
195
  refetchIntervalInBackground: true,
194
196
  });
195
197
 
package/src/index.ts CHANGED
@@ -23,6 +23,7 @@ export * from "./components/disabled-action-tooltip";
23
23
  export * from "./components/dropdown";
24
24
  export * from "./components/editable-text";
25
25
  export * from "./components/empty-state";
26
+ export * from "./components/file-dropzone";
26
27
  export * from "./components/filter-sheet";
27
28
  export * from "./components/hover-media";
28
29
  export * from "./components/input";
@@ -1,4 +1,4 @@
1
- /* eslint-disable import/order -- each type is imported beside the re-export it exists for, which is
1
+ /* oxlint-disable import-js/order -- each type is imported beside the re-export it exists for, which is
2
2
  how this file is organized; they are type-only, so the positions have no runtime meaning. */
3
3
  import type { ConversationMode } from "@manta-eu/client/shared/chat-manager";
4
4
  import type { MantaModelId } from "@manta-eu/client/shared/model";
@@ -24,6 +24,9 @@ export type RouteElements = {
24
24
  DataExplorerIndex?: ReactNode;
25
25
  DataExplorerRecent?: ReactNode;
26
26
  DataExplorerCoverage?: ReactNode;
27
+ DataExplorerFiles?: ReactNode;
28
+ DataExplorerIngest?: ReactNode;
29
+ DataCollection?: ReactNode;
27
30
  DataExplorerPrefix?: ReactNode;
28
31
  DataExplorerType?: ReactNode;
29
32
  DataEntity?: ReactNode;
@@ -72,12 +75,15 @@ export const datastoreRoutes: RouteDefinition[] = [
72
75
  { path: "/data", render: (e) => e.DataExplorerIndex || notFoundElement(e) },
73
76
  { path: "/data/recent", render: (e) => e.DataExplorerRecent || notFoundElement(e) },
74
77
  { path: "/data/coverage", render: (e) => e.DataExplorerCoverage || notFoundElement(e) },
78
+ { path: "/data/files", render: (e) => e.DataExplorerFiles || notFoundElement(e) },
79
+ { path: "/data/ingest-runs", render: (e) => e.DataExplorerIngest || notFoundElement(e) },
75
80
  { path: "/data/entity/:iri", render: (e) => e.DataEntity || notFoundElement(e) },
76
81
  { path: "/data/:prefix", render: (e) => e.DataExplorerPrefix || notFoundElement(e) },
77
82
  { path: "/data/:prefix/:type", render: (e) => e.DataExplorerType || notFoundElement(e) },
78
83
  { path: "/data/:prefix/:type/:id", render: (e) => e.DataDetail || notFoundElement(e) },
79
84
  ],
80
85
  },
86
+ { path: "/data-collection", render: (e) => e.DataCollection || notFoundElement(e) },
81
87
  { path: newChatPath, render: (e) => e.Chat },
82
88
  { path: "/chat/:chatId", render: (e) => e.Chat },
83
89
  { path: notFoundRoutePath, render: notFoundElement },
@@ -21,13 +21,13 @@ export type UploadProgress = Record<string, number>;
21
21
 
22
22
  const uploadConcurrency = 6;
23
23
 
24
- export type UseChatUploadResult = {
24
+ export type UseFileUploadResult = {
25
25
  uploadFiles: (files: File[]) => Promise<UploadFilesResult>;
26
26
  isUploading: boolean;
27
27
  progress: UploadProgress;
28
28
  };
29
29
 
30
- export function useChatUpload(): UseChatUploadResult {
30
+ export function useFileUpload(): UseFileUploadResult {
31
31
  const { mantaClient, uploadRelay } = useMantaClient();
32
32
 
33
33
  const { mutateAsync: initiateUpload } = useInitiateUploadMutation(mantaClient);
@@ -1,7 +1,7 @@
1
1
  import type { QueryClient, QueryKey } from "@tanstack/react-query";
2
2
 
3
3
  export type QueryWithGetKey = {
4
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
+ // oxlint-disable-next-line typescript/no-explicit-any
5
5
  getKey: (variables?: any) => QueryKey;
6
6
  };
7
7
 
@@ -12,7 +12,7 @@ function isQueryWithGetKey(keyLike: KeyLike): keyLike is QueryWithGetKey {
12
12
  }
13
13
 
14
14
  function getTopQueryKey(query: QueryWithGetKey): QueryKey {
15
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ // oxlint-disable-next-line typescript/no-explicit-any
16
16
  const keys = query.getKey({} as any);
17
17
  return keys.slice(0, 1);
18
18
  }
@@ -14,7 +14,7 @@ export type TermBatcherConfig<T> = {
14
14
  };
15
15
 
16
16
  export type TermBatcher = {
17
- request: (iris: IRI[]) => void;
17
+ request: (iris: IRI[], options?: { force: boolean }) => void;
18
18
  cancel: () => void;
19
19
  };
20
20
 
@@ -98,13 +98,13 @@ export function createTermBatcher<T>(config: TermBatcherConfig<T>): TermBatcher
98
98
  }
99
99
 
100
100
  return {
101
- request(iris) {
101
+ request(iris, options) {
102
102
  cancelled = false;
103
103
 
104
104
  const unresolvable: IRI[] = [];
105
105
 
106
106
  for (const iri of iris) {
107
- if (requested.has(iri)) continue;
107
+ if (requested.has(iri) && !options?.force) continue;
108
108
 
109
109
  requested.add(iri);
110
110
 
package/src/lib/utils.ts CHANGED
@@ -1,4 +1,4 @@
1
- /* eslint-disable @manta-eu/no-direct-clsx */
1
+ /* oxlint-disable @manta-eu/no-direct-clsx */
2
2
  import { clsx, type ClassValue } from "clsx";
3
3
  import { extendTailwindMerge } from "tailwind-merge";
4
4
 
@@ -0,0 +1,82 @@
1
+ import { fileIdentityKey } from "@manta-eu/lib/file";
2
+ import { isPresent } from "@manta-eu/lib/present";
3
+ import { FolderUp } from "lucide-react";
4
+ import { useState } from "react";
5
+ import { toast } from "sonner";
6
+ import { FileDropzone, UploadProgressList, type RejectedDrop } from "#components/file-dropzone/index";
7
+ import { PageBody, PageHeader } from "#components/layouts/page/index";
8
+ import { RouteLayout } from "#components/layouts/RouteLayout";
9
+ import { useFileUpload } from "#lib/hooks/useFileUpload";
10
+ import { useAuthContext } from "#providers/AuthContext";
11
+ import { UploadedFilesSection } from "#routes/data-explorer/components/uploads/UploadsPages";
12
+ import { useInvalidateUploads } from "#routes/data-explorer/uploads";
13
+
14
+ function showRejected(rejected: RejectedDrop[]) {
15
+ for (const { file, reason } of rejected) toast.error(`${file.name}: ${reason}`);
16
+ }
17
+
18
+ export function DataCollectionUploader() {
19
+ const { uploadFiles, progress } = useFileUpload();
20
+ const invalidateUploads = useInvalidateUploads();
21
+ const [inFlight, setInFlight] = useState<File[]>([]);
22
+
23
+ async function handleFiles(files: File[]) {
24
+ setInFlight((current) => [...current, ...files]);
25
+
26
+ try {
27
+ const { uploaded, failed } = await uploadFiles(files);
28
+
29
+ for (const { file } of failed) toast.error(`${file.name} could not be uploaded. Try again.`);
30
+ if (isPresent(uploaded)) toast.success(`Uploaded ${uploaded.length} of ${files.length} files`);
31
+ } finally {
32
+ const done = new Set(files.map(fileIdentityKey));
33
+
34
+ setInFlight((current) => current.filter((file) => !done.has(fileIdentityKey(file))));
35
+ await invalidateUploads();
36
+ }
37
+ }
38
+
39
+ return (
40
+ <div className="flex flex-col gap-3">
41
+ <FileDropzone onFiles={(files) => void handleFiles(files)} onRejected={showRejected} />
42
+ <UploadProgressList files={inFlight} progress={progress} />
43
+ </div>
44
+ );
45
+ }
46
+
47
+ export function DataCollectionRoute() {
48
+ const { datastore, datastores, user, logout, isOperator, canSwitchDatastore } = useAuthContext();
49
+
50
+ return (
51
+ <RouteLayout
52
+ user={user}
53
+ datastore={datastore}
54
+ datastores={datastores}
55
+ isOperator={isOperator}
56
+ canSwitchDatastore={canSwitchDatastore}
57
+ logout={logout}
58
+ >
59
+ <PageHeader title="Data collection" icon={FolderUp} />
60
+ <PageBody className="px-4 py-6 sm:px-6">
61
+ <div className="mx-auto flex max-w-4xl flex-col gap-8">
62
+ <div className="flex flex-col gap-2">
63
+ <h2 className="typography-header text-default-foreground">Upload your sample data</h2>
64
+ <p className="typography-small max-w-prose text-muted-foreground">
65
+ Add the sample files you want to share with us. They are stored in this datastore only. Remove personal
66
+ data before you upload.
67
+ </p>
68
+ </div>
69
+
70
+ <DataCollectionUploader />
71
+
72
+ <section className="flex flex-col gap-3" aria-labelledby="data-collection-files">
73
+ <h3 id="data-collection-files" className="typography-body-medium text-default-foreground">
74
+ Uploaded files
75
+ </h3>
76
+ <UploadedFilesSection emptyText="Nothing uploaded yet. Files you add appear here with their status." />
77
+ </section>
78
+ </div>
79
+ </PageBody>
80
+ </RouteLayout>
81
+ );
82
+ }
@@ -4,7 +4,7 @@ import { useEffect } from "react";
4
4
  import { Outlet, useMatch } from "react-router";
5
5
  import { useDeclaredNamespaces } from "../declared-namespaces";
6
6
  import { useRailState } from "../hooks/useRailState";
7
- import { coveragePath, explorerPath } from "../namespaces";
7
+ import { coveragePath, explorerPath, filesPath, ingestRunsPath } from "../namespaces";
8
8
  import { Rail } from "./Rail";
9
9
  import { RailSheet } from "./RailSheet";
10
10
  import { LoadingRows } from "./RawTriples";
@@ -31,7 +31,10 @@ export function DataExplorerLayout() {
31
31
  const { datastore, datastores, user, logout, isOperator, canSwitchDatastore } = useAuthContext();
32
32
 
33
33
  const isIndex = Boolean(useMatch(explorerPath));
34
- const isFullPage = Boolean(useMatch(coveragePath));
34
+ const isCoverage = Boolean(useMatch(coveragePath));
35
+ const isFiles = Boolean(useMatch(filesPath));
36
+ const isIngest = Boolean(useMatch(ingestRunsPath));
37
+ const isFullPage = isCoverage || isFiles || isIngest;
35
38
  const railState = useRailState();
36
39
  const { isLoading: isLoadingNamespaces } = useDeclaredNamespaces();
37
40
 
@@ -42,14 +42,14 @@ export function DetailHeader(props: DetailHeaderProps) {
42
42
  <div>
43
43
  {badges && <div className="mb-3 flex items-center gap-2">{badges}</div>}
44
44
 
45
- <div className="flex items-start justify-between gap-4">
46
- <div className="flex items-center gap-3">
47
- <h2 className="typography-header wrap-break-words text-default-foreground">{title}</h2>
45
+ <div className="flex flex-col items-start justify-between gap-4 sm:flex-row">
46
+ <div className="flex min-w-0 items-center gap-3">
47
+ <h2 className="typography-header wrap-anywhere text-default-foreground">{title}</h2>
48
48
 
49
49
  {titleBadges}
50
50
  </div>
51
51
 
52
- {actions && <div className="flex shrink-0 items-center gap-2">{actions}</div>}
52
+ {actions && <div className="flex flex-wrap items-center gap-2 sm:shrink-0">{actions}</div>}
53
53
  </div>
54
54
 
55
55
  {iri &&
@@ -1,10 +1,19 @@
1
1
  import { isPresent } from "@manta-eu/lib/present";
2
- import { Clock, Gauge } from "lucide-react";
2
+ import { Clock, FileUp, Gauge, Workflow } from "lucide-react";
3
3
  import { useEffect, useMemo, useRef } from "react";
4
4
  import { useMatch } from "react-router";
5
5
  import { buildClassGroups, useExplorerClasses, useInstanceCounts, useSubclassEdges } from "../classes";
6
6
  import { type RailState } from "../hooks/useRailState";
7
- import { coveragePath, explorerPath, isNamespaceSegment, prefixForIri, recentPath, groupKeyFor } from "../namespaces";
7
+ import {
8
+ coveragePath,
9
+ explorerPath,
10
+ filesPath,
11
+ groupKeyFor,
12
+ ingestRunsPath,
13
+ isNamespaceSegment,
14
+ prefixForIri,
15
+ recentPath,
16
+ } from "../namespaces";
8
17
  import { ClassTreeNodes } from "./ClassTreeNodes";
9
18
  import { NamespaceGroupRow } from "./NamespaceGroupRow";
10
19
  import { RailLink } from "./RailLink";
@@ -63,6 +72,8 @@ export function Rail(props: RailProps) {
63
72
  <SearchInput placeholder="Filter types…" value={filter} onChange={(e) => setFilter(e.target.value)} />
64
73
  <RailLink to={recentPath} icon={Clock} label="Recently modified" />
65
74
  <RailLink to={coveragePath} icon={Gauge} label="Ontology coverage" />
75
+ <RailLink to={filesPath} icon={FileUp} label="Files" />
76
+ <RailLink to={ingestRunsPath} icon={Workflow} label="Ingest runs" />
66
77
  </div>
67
78
 
68
79
  <div ref={listRef} className="min-h-0 flex-1 overflow-y-auto px-2 pb-4">