@object-ui/app-shell 6.2.3 → 7.0.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 (468) hide show
  1. package/CHANGELOG.md +948 -0
  2. package/README.md +292 -0
  3. package/dist/assistant/assistantBus.d.ts +72 -0
  4. package/dist/assistant/assistantBus.js +133 -0
  5. package/dist/chrome/CommandPalette.d.ts +1 -1
  6. package/dist/chrome/CommandPalette.js +26 -22
  7. package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
  8. package/dist/chrome/ConsoleToaster.d.ts +1 -1
  9. package/dist/chrome/ConsoleToaster.js +3 -1
  10. package/dist/chrome/ErrorBoundary.d.ts +1 -1
  11. package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
  12. package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
  13. package/dist/chrome/LoadingScreen.d.ts +1 -1
  14. package/dist/chrome/LoadingScreen.js +22 -26
  15. package/dist/chrome/RouteFader.d.ts +1 -1
  16. package/dist/chrome/ThemeProvider.d.ts +1 -1
  17. package/dist/components/ManagedByBadge.d.ts +1 -1
  18. package/dist/console/AppContent.d.ts +1 -1
  19. package/dist/console/AppContent.js +170 -37
  20. package/dist/console/ConsoleShell.d.ts +7 -7
  21. package/dist/console/ConsoleShell.js +32 -3
  22. package/dist/console/ai/AiChatPage.d.ts +88 -1
  23. package/dist/console/ai/AiChatPage.js +743 -66
  24. package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
  25. package/dist/console/ai/ConversationsSidebar.js +149 -34
  26. package/dist/console/ai/LiveCanvas.d.ts +22 -0
  27. package/dist/console/ai/LiveCanvas.js +78 -0
  28. package/dist/console/ai/reconcileTurn.d.ts +8 -0
  29. package/dist/console/ai/reconcileTurn.js +20 -0
  30. package/dist/console/auth/AuthPageLayout.d.ts +1 -1
  31. package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
  32. package/dist/console/auth/LoginPage.d.ts +1 -1
  33. package/dist/console/auth/RegisterPage.d.ts +1 -1
  34. package/dist/console/auth/RegisterPage.js +23 -3
  35. package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
  36. package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
  37. package/dist/console/home/AppCard.d.ts +1 -1
  38. package/dist/console/home/AppCard.js +6 -12
  39. package/dist/console/home/HomeAppsStrip.d.ts +8 -0
  40. package/dist/console/home/HomeAppsStrip.js +61 -0
  41. package/dist/console/home/HomeLayout.d.ts +1 -1
  42. package/dist/console/home/HomeLayout.js +3 -1
  43. package/dist/console/home/HomePage.d.ts +1 -2
  44. package/dist/console/home/HomePage.js +149 -21
  45. package/dist/console/home/HomeRail.d.ts +22 -0
  46. package/dist/console/home/HomeRail.js +62 -0
  47. package/dist/console/home/QuickActions.d.ts +1 -1
  48. package/dist/console/home/QuickActions.js +3 -11
  49. package/dist/console/home/RecentApps.d.ts +1 -1
  50. package/dist/console/home/RecentApps.js +2 -2
  51. package/dist/console/home/StarredApps.d.ts +1 -1
  52. package/dist/console/home/StarredApps.js +2 -2
  53. package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
  54. package/dist/console/marketplace/InstalledListWidget.js +93 -0
  55. package/dist/console/marketplace/MarkdownText.d.ts +1 -1
  56. package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
  57. package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
  58. package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
  59. package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
  60. package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
  61. package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
  62. package/dist/console/marketplace/MarketplacePage.js +60 -3
  63. package/dist/console/marketplace/PackageIcon.d.ts +1 -1
  64. package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
  65. package/dist/console/marketplace/PluginDisclosure.js +38 -0
  66. package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
  67. package/dist/console/marketplace/marketplaceApi.js +254 -1
  68. package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
  69. package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
  70. package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
  71. package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
  72. package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
  73. package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
  74. package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
  75. package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
  76. package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
  77. package/dist/context/CommandPaletteProvider.d.ts +44 -0
  78. package/dist/context/CommandPaletteProvider.js +71 -0
  79. package/dist/context/FavoritesProvider.d.ts +1 -1
  80. package/dist/context/NavigationContext.d.ts +1 -1
  81. package/dist/context/RecentItemsProvider.d.ts +2 -2
  82. package/dist/context/UserStateAdapters.d.ts +1 -1
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.js +1 -0
  85. package/dist/hooks/index.d.ts +5 -2
  86. package/dist/hooks/index.js +4 -1
  87. package/dist/hooks/useActionModal.d.ts +53 -0
  88. package/dist/hooks/useActionModal.js +111 -0
  89. package/dist/hooks/useChatConversation.d.ts +107 -4
  90. package/dist/hooks/useChatConversation.js +253 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +560 -0
  93. package/dist/hooks/useConversationList.js +61 -3
  94. package/dist/hooks/useHomeInbox.d.ts +13 -0
  95. package/dist/hooks/useHomeInbox.js +142 -0
  96. package/dist/hooks/useNavPins.js +17 -23
  97. package/dist/hooks/useNavigationSync.d.ts +33 -0
  98. package/dist/hooks/useNavigationSync.js +98 -12
  99. package/dist/hooks/useReconcileOnError.d.ts +40 -0
  100. package/dist/hooks/useReconcileOnError.js +37 -0
  101. package/dist/hooks/useRecordApprovals.d.ts +18 -19
  102. package/dist/hooks/useRecordApprovals.js +24 -40
  103. package/dist/hooks/useResponsiveSidebar.js +14 -5
  104. package/dist/hooks/useSettleSignal.d.ts +19 -0
  105. package/dist/hooks/useSettleSignal.js +20 -0
  106. package/dist/hooks/useTrackRouteAsRecent.js +35 -0
  107. package/dist/hooks/useUrlOverlay.d.ts +62 -0
  108. package/dist/hooks/useUrlOverlay.js +88 -0
  109. package/dist/index.d.ts +16 -7
  110. package/dist/index.js +12 -4
  111. package/dist/layout/ActivityFeed.d.ts +1 -1
  112. package/dist/layout/AppHeader.d.ts +3 -2
  113. package/dist/layout/AppHeader.js +237 -72
  114. package/dist/layout/AppSidebar.d.ts +2 -1
  115. package/dist/layout/AppSidebar.js +26 -46
  116. package/dist/layout/AppSwitcher.d.ts +2 -1
  117. package/dist/layout/AppSwitcher.js +9 -5
  118. package/dist/layout/AuthPageLayout.d.ts +1 -1
  119. package/dist/layout/ConnectionStatus.d.ts +1 -1
  120. package/dist/layout/ConnectionStatus.js +9 -6
  121. package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
  122. package/dist/layout/ConsoleChatbotFab.js +16 -2
  123. package/dist/layout/ConsoleFloatingChatbot.d.ts +32 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +374 -41
  125. package/dist/layout/ConsoleLayout.d.ts +1 -1
  126. package/dist/layout/ConsoleLayout.js +27 -11
  127. package/dist/layout/ContextSelectors.d.ts +44 -0
  128. package/dist/layout/ContextSelectors.js +218 -0
  129. package/dist/layout/InboxPopover.d.ts +6 -1
  130. package/dist/layout/InboxPopover.js +25 -6
  131. package/dist/layout/LocaleSwitcher.d.ts +1 -1
  132. package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
  133. package/dist/layout/LocalizedSidebarTrigger.js +15 -0
  134. package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
  135. package/dist/layout/ModeToggle.d.ts +1 -1
  136. package/dist/layout/PageHeader.d.ts +1 -1
  137. package/dist/layout/UnifiedSidebar.d.ts +2 -1
  138. package/dist/layout/UnifiedSidebar.js +116 -15
  139. package/dist/observability/index.d.ts +1 -0
  140. package/dist/observability/index.js +1 -0
  141. package/dist/observability/settleSignal.d.ts +64 -0
  142. package/dist/observability/settleSignal.js +131 -0
  143. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  144. package/dist/preview/DraftChangesPanel.js +114 -0
  145. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  146. package/dist/preview/DraftPreviewBar.js +86 -0
  147. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  148. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  149. package/dist/preview/PreviewModeContext.d.ts +57 -0
  150. package/dist/preview/PreviewModeContext.js +99 -0
  151. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  152. package/dist/preview/UnpublishedAppBar.js +79 -0
  153. package/dist/preview/draftStatus.d.ts +20 -0
  154. package/dist/preview/draftStatus.js +27 -0
  155. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  156. package/dist/preview/usePublishAllDrafts.js +106 -0
  157. package/dist/providers/AdapterProvider.d.ts +1 -1
  158. package/dist/providers/AdapterProvider.js +6 -1
  159. package/dist/providers/ExpressionProvider.d.ts +1 -1
  160. package/dist/providers/MetadataProvider.d.ts +17 -2
  161. package/dist/providers/MetadataProvider.js +183 -12
  162. package/dist/runtime-config.d.ts +46 -2
  163. package/dist/runtime-config.js +39 -2
  164. package/dist/services/builtinComponents.js +68 -59
  165. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  166. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  167. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  168. package/dist/utils/appRoute.d.ts +21 -0
  169. package/dist/utils/appRoute.js +25 -0
  170. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  171. package/dist/utils/deriveRelatedLists.js +91 -0
  172. package/dist/utils/index.d.ts +4 -0
  173. package/dist/utils/index.js +3 -0
  174. package/dist/utils/managedByEmptyState.d.ts +8 -1
  175. package/dist/utils/managedByEmptyState.js +13 -7
  176. package/dist/utils/preferLocal.d.ts +18 -0
  177. package/dist/utils/preferLocal.js +24 -0
  178. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  179. package/dist/views/ActionConfirmDialog.js +3 -1
  180. package/dist/views/ActionParamDialog.d.ts +6 -1
  181. package/dist/views/ActionParamDialog.js +9 -3
  182. package/dist/views/ActionResultDialog.d.ts +13 -0
  183. package/dist/views/ActionResultDialog.js +134 -0
  184. package/dist/views/ComponentNavView.d.ts +14 -1
  185. package/dist/views/CreateViewDialog.d.ts +1 -1
  186. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  187. package/dist/views/DashboardConfigPanel.js +81 -0
  188. package/dist/views/DashboardView.d.ts +4 -3
  189. package/dist/views/DashboardView.js +38 -239
  190. package/dist/views/FlowRunner.d.ts +59 -0
  191. package/dist/views/FlowRunner.js +153 -0
  192. package/dist/views/InterfaceListPage.d.ts +49 -0
  193. package/dist/views/InterfaceListPage.js +347 -0
  194. package/dist/views/MetadataInspector.d.ts +2 -2
  195. package/dist/views/ObjectView.d.ts +1 -1
  196. package/dist/views/ObjectView.js +209 -532
  197. package/dist/views/PageView.d.ts +8 -3
  198. package/dist/views/PageView.js +45 -32
  199. package/dist/views/RecordDetailView.d.ts +1 -1
  200. package/dist/views/RecordDetailView.js +363 -148
  201. package/dist/views/RecordFormPage.d.ts +1 -1
  202. package/dist/views/RecordFormPage.js +26 -1
  203. package/dist/views/ReportConfigPanel.d.ts +37 -0
  204. package/dist/views/ReportConfigPanel.js +85 -0
  205. package/dist/views/ReportView.d.ts +1 -1
  206. package/dist/views/ReportView.js +116 -7
  207. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  208. package/dist/views/RuntimeDraftBar.js +112 -0
  209. package/dist/views/SearchResultsPage.d.ts +1 -1
  210. package/dist/views/SearchResultsPage.js +8 -18
  211. package/dist/views/ViewConfigPanel.d.ts +24 -17
  212. package/dist/views/ViewConfigPanel.js +121 -77
  213. package/dist/views/index.d.ts +1 -1
  214. package/dist/views/index.js +1 -1
  215. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  216. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  217. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  218. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  219. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  220. package/dist/views/metadata-admin/DirectoryPage.js +113 -24
  221. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  222. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  223. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  224. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  225. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +37 -0
  226. package/dist/views/metadata-admin/JsonSourceEditor.js +178 -0
  227. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  228. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  229. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  230. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  231. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  232. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  233. package/dist/views/metadata-admin/PackagesPage.js +395 -0
  234. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  235. package/dist/views/metadata-admin/PageShell.js +9 -4
  236. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  237. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  238. package/dist/views/metadata-admin/QuickFind.js +6 -3
  239. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  240. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  241. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  242. package/dist/views/metadata-admin/ResourceEditPage.js +1223 -60
  243. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  244. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  245. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  246. package/dist/views/metadata-admin/ResourceListPage.js +266 -30
  247. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  248. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  249. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  250. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  251. package/dist/views/metadata-admin/StudioHomePage.js +213 -0
  252. package/dist/views/metadata-admin/anchors.js +237 -24
  253. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  254. package/dist/views/metadata-admin/clientValidation.js +169 -0
  255. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  256. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  257. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  258. package/dist/views/metadata-admin/createDerive.js +179 -0
  259. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  260. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  261. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  262. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  263. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  264. package/dist/views/metadata-admin/datasource/register.js +24 -0
  265. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  266. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  267. package/dist/views/metadata-admin/default-schemas.js +115 -10
  268. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  269. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  270. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  271. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  272. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  273. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  274. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  275. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  276. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  277. package/dist/views/metadata-admin/external/api.js +124 -0
  278. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  279. package/dist/views/metadata-admin/i18n.js +1166 -2
  280. package/dist/views/metadata-admin/index.d.ts +8 -5
  281. package/dist/views/metadata-admin/index.js +12 -2
  282. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  283. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  284. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  285. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  286. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  287. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  288. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  289. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  290. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  291. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  292. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  293. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  294. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  295. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +107 -0
  296. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  297. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +45 -0
  298. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  299. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  300. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  301. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  302. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  303. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  304. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  305. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +140 -0
  306. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  307. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  308. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  309. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  310. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  311. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  312. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  313. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  314. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  315. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +54 -0
  316. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  317. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +330 -0
  318. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  319. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  320. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  321. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +160 -0
  322. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  323. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  324. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  325. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  326. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  327. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  328. package/dist/views/metadata-admin/inspectors/_shared.d.ts +124 -0
  329. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  330. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  331. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  332. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  333. package/dist/views/metadata-admin/inspectors/flow-node-config.js +461 -0
  334. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  335. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  336. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  337. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  338. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  339. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  340. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  341. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  342. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  343. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  344. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  345. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  346. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  347. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  348. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  349. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  350. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  351. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  352. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  353. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  354. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  355. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  356. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  357. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  358. package/dist/views/metadata-admin/previews/DatasetPreview.js +89 -0
  359. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  360. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  361. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  362. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  363. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  364. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  365. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  366. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +43 -0
  367. package/dist/views/metadata-admin/previews/FlowCanvas.js +328 -0
  368. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  369. package/dist/views/metadata-admin/previews/FlowPreview.js +92 -0
  370. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  371. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  372. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  373. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +170 -0
  374. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  375. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  376. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  378. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  379. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  380. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  381. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  382. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  383. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  384. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  385. package/dist/views/metadata-admin/previews/PagePreview.js +90 -4
  386. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  387. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  388. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  389. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  390. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  391. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  392. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  393. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  394. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  395. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  396. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  397. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  398. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  399. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  400. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  402. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  403. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  404. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  405. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  406. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  407. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  408. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  409. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  410. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  411. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  412. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +88 -0
  413. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +190 -0
  414. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +88 -0
  415. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +358 -0
  416. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  417. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  418. package/dist/views/metadata-admin/previews/index.js +43 -0
  419. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  420. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  421. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +109 -0
  422. package/dist/views/metadata-admin/previews/object-fields-io.js +208 -0
  423. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +91 -0
  424. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  425. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +8 -0
  426. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +113 -0
  427. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +44 -0
  428. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +316 -0
  429. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  430. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  431. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  432. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  433. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  434. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  435. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  436. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  437. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  438. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  439. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  440. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  441. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  442. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  443. package/dist/views/metadata-admin/registry.d.ts +140 -19
  444. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  445. package/dist/views/metadata-admin/report-schema.js +121 -0
  446. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  447. package/dist/views/metadata-admin/useMetadata.js +155 -4
  448. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  449. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  450. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  451. package/dist/views/metadata-admin/view-schema.js +107 -0
  452. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  453. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  454. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  455. package/dist/views/metadata-admin/widgets.js +491 -17
  456. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  457. package/dist/views/runtime-metadata-persistence.js +89 -0
  458. package/dist/views/useOpenRecordList.d.ts +18 -0
  459. package/dist/views/useOpenRecordList.js +36 -0
  460. package/dist/views/userFilterUrlState.d.ts +15 -0
  461. package/dist/views/userFilterUrlState.js +53 -0
  462. package/dist/views/view-config-adapter.d.ts +38 -0
  463. package/dist/views/view-config-adapter.js +80 -0
  464. package/package.json +52 -34
  465. package/dist/views/DesignDrawer.d.ts +0 -28
  466. package/dist/views/DesignDrawer.js +0 -51
  467. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  468. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -0,0 +1,218 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * AppContextSelectors — renders the app-level "scope" dropdowns declared
5
+ * in `App.contextSelectors` (e.g. the Studio package filter) and exposes
6
+ * their current values so the sidebar can feed them into
7
+ * `NavigationRenderer`'s `templateContext.contextValues`.
8
+ *
9
+ * Each selector's value is published under its `id` and referenced by
10
+ * nav items as `{<id>}` (e.g. `{active_package}`), exactly like the
11
+ * built-in `{current_user_id}` / `{current_org_id}` template vars.
12
+ * Selecting an option therefore transparently scopes every child nav
13
+ * item — no per-item wiring required.
14
+ *
15
+ * @module
16
+ */
17
+ import * as React from 'react';
18
+ import { useLocation, useNavigate } from 'react-router-dom';
19
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@object-ui/components';
20
+ import { getIcon } from '../utils/getIcon';
21
+ import { resolveI18nLabel } from '../utils';
22
+ const ALL_SENTINEL = '__all__';
23
+ /** Read a (possibly dotted) property path off a row, e.g. `manifest.id`. */
24
+ function getByPath(row, key) {
25
+ if (!key)
26
+ return undefined;
27
+ return key.split('.').reduce((o, k) => (o == null ? o : o[k]), row);
28
+ }
29
+ /** Tolerate the common REST envelope shapes used across the platform. */
30
+ function extractRows(json) {
31
+ if (Array.isArray(json))
32
+ return json;
33
+ const d = json?.data ?? json;
34
+ if (Array.isArray(d))
35
+ return d;
36
+ if (Array.isArray(d?.packages))
37
+ return d.packages;
38
+ if (Array.isArray(d?.items))
39
+ return d.items;
40
+ if (Array.isArray(json?.items))
41
+ return json.items;
42
+ return [];
43
+ }
44
+ /** Apply a selector's `filter` predicates (AND) to a fetched row. */
45
+ function rowPasses(row, filters) {
46
+ if (!filters || filters.length === 0)
47
+ return true;
48
+ for (const f of filters) {
49
+ const actual = getByPath(row, f.key);
50
+ const op = f.op ?? 'eq';
51
+ const list = Array.isArray(f.value) ? f.value : [f.value];
52
+ switch (op) {
53
+ case 'eq':
54
+ if (actual !== f.value)
55
+ return false;
56
+ break;
57
+ case 'ne':
58
+ if (actual === f.value)
59
+ return false;
60
+ break;
61
+ // `in`/`nin` treat a missing value as "not in the set", which keeps
62
+ // untagged rows visible under `nin` (e.g. a package whose manifest
63
+ // omits `scope` defaults to project and should remain selectable).
64
+ case 'in':
65
+ if (!list.includes(actual))
66
+ return false;
67
+ break;
68
+ case 'nin':
69
+ if (list.includes(actual))
70
+ return false;
71
+ break;
72
+ }
73
+ }
74
+ return true;
75
+ }
76
+ function useSelectorOptions(def) {
77
+ const [options, setOptions] = React.useState([]);
78
+ const endpoint = def.optionsSource.endpoint;
79
+ const valueKey = def.optionsSource.valueKey || 'id';
80
+ const labelKey = def.optionsSource.labelKey || 'name';
81
+ const filters = def.optionsSource.filter;
82
+ const filterKey = JSON.stringify(filters ?? []);
83
+ React.useEffect(() => {
84
+ let cancelled = false;
85
+ (async () => {
86
+ try {
87
+ const res = await fetch(endpoint, {
88
+ credentials: 'include',
89
+ headers: { Accept: 'application/json' },
90
+ });
91
+ if (!res.ok)
92
+ return;
93
+ const json = await res.json();
94
+ if (cancelled)
95
+ return;
96
+ const rows = extractRows(json);
97
+ const opts = [];
98
+ const seen = new Set();
99
+ for (const row of rows) {
100
+ if (!rowPasses(row, filters))
101
+ continue;
102
+ const value = getByPath(row, valueKey);
103
+ if (value == null || typeof value !== 'string' || seen.has(value))
104
+ continue;
105
+ seen.add(value);
106
+ const labelRaw = getByPath(row, labelKey);
107
+ opts.push({ value, label: typeof labelRaw === 'string' && labelRaw ? labelRaw : value });
108
+ }
109
+ opts.sort((a, b) => a.label.localeCompare(b.label));
110
+ setOptions(opts);
111
+ }
112
+ catch {
113
+ /* offline / unauthorized — render with no options */
114
+ }
115
+ })();
116
+ return () => { cancelled = true; };
117
+ // eslint-disable-next-line react-hooks/exhaustive-deps
118
+ }, [endpoint, valueKey, labelKey, filterKey]);
119
+ return options;
120
+ }
121
+ /**
122
+ * Hook: resolves the active values for an app's context selectors and
123
+ * returns a ready-to-render UI element plus the `contextValues` map for
124
+ * `NavigationRenderer`.
125
+ */
126
+ export function useAppContextSelectors(appName, selectors, t) {
127
+ const list = Array.isArray(selectors) ? selectors : [];
128
+ const navigate = useNavigate();
129
+ const location = useLocation();
130
+ // The URL query string is the single source of truth for the active
131
+ // scope. Deriving the selected value from it (rather than a parallel
132
+ // useState) keeps the sidebar control in lock-step with the page — no
133
+ // more "sidebar says A while the list shows B" drift.
134
+ const params = new URLSearchParams(location.search);
135
+ // Re-apply a remembered scope whenever navigation drops the query param.
136
+ // The selector is mandatory for Studio: package-scoped pages should never
137
+ // sit at a blank package value just because a nav link omitted `?package=`.
138
+ React.useEffect(() => {
139
+ const p = new URLSearchParams(location.search);
140
+ let changed = false;
141
+ for (const sel of list) {
142
+ if (sel.persist === 'none')
143
+ continue;
144
+ if (p.get('package'))
145
+ continue;
146
+ try {
147
+ const saved = sessionStorage.getItem(`objectui-ctx-${appName}-${sel.id}`);
148
+ if (saved) {
149
+ p.set('package', saved);
150
+ changed = true;
151
+ }
152
+ }
153
+ catch { /* storage disabled */ }
154
+ }
155
+ if (changed) {
156
+ navigate({ pathname: location.pathname, search: p.toString() }, { replace: true });
157
+ }
158
+ }, [appName, list, location.pathname, location.search, navigate]);
159
+ const setValue = React.useCallback((sel, raw) => {
160
+ const value = raw === ALL_SENTINEL ? (sel.allValue ?? '') : raw;
161
+ try {
162
+ const key = `objectui-ctx-${appName}-${sel.id}`;
163
+ if (value)
164
+ sessionStorage.setItem(key, value);
165
+ else
166
+ sessionStorage.removeItem(key);
167
+ }
168
+ catch { /* storage disabled */ }
169
+ // Reflect the scope onto the current page immediately. Metadata
170
+ // surfaces read the `package` query param as the conventional filter
171
+ // key; nav links pick it up via the `{active_package}` template var.
172
+ const next = new URLSearchParams(location.search);
173
+ if (value)
174
+ next.set('package', value);
175
+ else
176
+ next.delete('package');
177
+ navigate({ pathname: location.pathname, search: next.toString() }, { replace: true });
178
+ }, [appName, location.pathname, location.search, navigate]);
179
+ const contextValues = {};
180
+ for (const sel of list) {
181
+ let saved = '';
182
+ try {
183
+ saved = sessionStorage.getItem(`objectui-ctx-${appName}-${sel.id}`) ?? '';
184
+ }
185
+ catch { /* storage disabled */ }
186
+ contextValues[sel.id] = (params.get('package') ?? saved) || (sel.allValue ?? '');
187
+ }
188
+ const element = list.length === 0 ? null : (_jsx("div", { className: "flex flex-col gap-1.5", children: list.map((sel) => (_jsx(SelectorControl, { def: sel, value: contextValues[sel.id], onChange: (raw) => setValue(sel, raw), t: t }, sel.id))) }));
189
+ return { contextValues, element };
190
+ }
191
+ function SelectorControl({ def, value, onChange, t, }) {
192
+ const options = useSelectorOptions(def);
193
+ const Icon = getIcon(def.icon);
194
+ const rawLabel = resolveI18nLabel(def.label, t) || def.id;
195
+ const label = rawLabel === 'Package'
196
+ ? (t?.('common.package', { defaultValue: rawLabel }) ?? rawLabel)
197
+ : rawLabel;
198
+ const placeholder = t?.('actionDialog.selectPlaceholder', {
199
+ label,
200
+ defaultValue: `Select ${label}…`,
201
+ }) ?? `Select ${label}…`;
202
+ // Context selectors are *mandatory scope* selectors: a concrete option must
203
+ // always be active. Allowing an "All" choice would unscope the surface and,
204
+ // for Studio's package filter, leak system metadata. We therefore ignore
205
+ // `includeAll`, never render an "All" row, and auto-select the first option
206
+ // as soon as the list resolves when nothing concrete is selected yet.
207
+ const hasConcrete = !!value && value !== (def.allValue ?? '');
208
+ React.useEffect(() => {
209
+ if (hasConcrete) {
210
+ return;
211
+ }
212
+ if (options.length > 0) {
213
+ onChange(options[0].value);
214
+ }
215
+ }, [hasConcrete, onChange, options]);
216
+ const current = hasConcrete ? value : '';
217
+ return (_jsxs(Select, { value: current, onValueChange: onChange, children: [_jsx(SelectTrigger, { "aria-label": label, className: "h-9 w-full gap-2 rounded-md border-sidebar-border/70 bg-sidebar/80 px-2 text-xs font-medium text-sidebar-foreground shadow-none transition-colors hover:bg-sidebar-accent focus:ring-1 focus:ring-sidebar-ring data-[state=open]:bg-sidebar-accent [&>svg]:h-3.5 [&>svg]:w-3.5 [&>svg]:shrink-0", children: _jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2 overflow-hidden", children: [_jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center rounded border border-sidebar-border/70 bg-sidebar-accent text-sidebar-foreground/70", children: _jsx(Icon, { className: "h-3 w-3" }) }), _jsx(SelectValue, { placeholder: placeholder, className: "truncate" })] }) }), _jsx(SelectContent, { className: "w-[var(--radix-select-trigger-width)]", children: options.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }));
218
+ }
@@ -16,9 +16,14 @@
16
16
  import type { ActivityItem } from './ActivityFeed';
17
17
  export interface InboxNotification {
18
18
  id: string;
19
+ /** FK → sys_notification (L2 event) — keys the read-state receipt (ADR-0030). */
20
+ notification_id?: string | null;
21
+ receipt_id?: string | null;
19
22
  type: string;
20
23
  title: string;
21
24
  body?: string | null;
25
+ /** Deep-link target carried by the inbox materialization. */
26
+ action_url?: string | null;
22
27
  source_object?: string | null;
23
28
  source_id?: string | null;
24
29
  actor_name?: string | null;
@@ -33,4 +38,4 @@ export interface InboxPopoverProps {
33
38
  onMarkAllRead: () => void;
34
39
  onMarkRead: (id: string) => void;
35
40
  }
36
- export declare function InboxPopover({ notifications, unreadCount, pendingApprovalsCount, activities, onMarkAllRead, onMarkRead, }: InboxPopoverProps): import("react/jsx-runtime").JSX.Element;
41
+ export declare function InboxPopover({ notifications, unreadCount, pendingApprovalsCount, activities, onMarkAllRead, onMarkRead, }: InboxPopoverProps): import("react").JSX.Element;
@@ -77,11 +77,11 @@ export function InboxPopover({ notifications, unreadCount, pendingApprovalsCount
77
77
  };
78
78
  const goToAllNotifications = () => {
79
79
  setOpen(false);
80
- // Always route through the setup app's sys_notification list view —
81
- // it's the canonical full-page inbox and lives outside per-app sidebars.
82
- // The `?view=mine` query selects the "Mine" tab so the user sees their
83
- // own notifications by default (matching the popover scope).
84
- navigate('/apps/setup/sys_notification?view=mine');
80
+ // Route through the setup app's sys_inbox_message list view — the
81
+ // canonical full-page inbox (ADR-0030 L5), outside per-app sidebars. The
82
+ // `?view=mine` query selects the user-scoped "Notifications" view, matching
83
+ // the popover scope.
84
+ navigate('/apps/setup/sys_inbox_message?view=mine');
85
85
  };
86
86
  const goToAllActivity = () => {
87
87
  setOpen(false);
@@ -92,9 +92,28 @@ export function InboxPopover({ notifications, unreadCount, pendingApprovalsCount
92
92
  };
93
93
  const handleNotificationClick = (n) => {
94
94
  onMarkRead(n.id);
95
+ const app = currentAppName ?? params.appName;
96
+ // Prefer the materialization's action_url (ADR-0030). The messaging
97
+ // pipeline synthesizes an app-relative `/{object}/{id}` link from the
98
+ // event's source when a producer didn't set an explicit url.
99
+ if (n.action_url) {
100
+ setOpen(false);
101
+ const url = n.action_url;
102
+ if (/^https?:\/\//i.test(url)) {
103
+ window.open(url, '_blank', 'noopener,noreferrer');
104
+ return;
105
+ }
106
+ if (url.startsWith('/apps/')) {
107
+ navigate(url);
108
+ return;
109
+ }
110
+ const rel = url.startsWith('/') ? url : `/${url}`;
111
+ navigate(app ? `/apps/${app}${rel}` : rel);
112
+ return;
113
+ }
114
+ // Back-compat fallback: explicit source object/record pointer.
95
115
  if (n.source_object && n.source_id) {
96
116
  setOpen(false);
97
- const app = currentAppName ?? params.appName;
98
117
  const target = app
99
118
  ? `/apps/${app}/${n.source_object}/${n.source_id}`
100
119
  : `/objects/${n.source_object}/${n.source_id}`;
@@ -4,4 +4,4 @@
4
4
  * Dropdown menu for switching the application language.
5
5
  * Uses the i18n context to change language at runtime.
6
6
  */
7
- export declare function LocaleSwitcher(): import("react/jsx-runtime").JSX.Element;
7
+ export declare function LocaleSwitcher(): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import * as React from 'react';
2
+ export declare const LocalizedSidebarTrigger: React.ForwardRefExoticComponent<Omit<import("@object-ui/components").ButtonProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { PanelLeft } from 'lucide-react';
4
+ import { Button, cn, useSidebar } from '@object-ui/components';
5
+ import { useObjectTranslation } from '@object-ui/i18n';
6
+ export const LocalizedSidebarTrigger = React.forwardRef(({ className, onClick, 'aria-label': ariaLabel, title, ...props }, ref) => {
7
+ const { toggleSidebar } = useSidebar();
8
+ const { t } = useObjectTranslation();
9
+ const label = String(ariaLabel || title || t('common.toggleSidebar', { defaultValue: 'Toggle sidebar' }));
10
+ return (_jsxs(Button, { ref: ref, "data-sidebar": "trigger", variant: "ghost", size: "icon", className: cn('h-7 w-7', className), "aria-label": label, title: label, onClick: (event) => {
11
+ onClick?.(event);
12
+ toggleSidebar();
13
+ }, ...props, children: [_jsx(PanelLeft, {}), _jsx("span", { className: "sr-only", children: label })] }));
14
+ });
15
+ LocalizedSidebarTrigger.displayName = 'LocalizedSidebarTrigger';
@@ -54,7 +54,7 @@ export interface MobileViewSwitcherValue {
54
54
  /** Provider — mount once near the top of the console tree (above AppHeader). */
55
55
  export declare function MobileViewSwitcherProvider({ children }: {
56
56
  children: React.ReactNode;
57
- }): import("react/jsx-runtime").JSX.Element;
57
+ }): React.JSX.Element;
58
58
  /** Read the currently registered switcher value (or `null`). */
59
59
  export declare function useMobileViewSwitcher(): MobileViewSwitcherValue | null;
60
60
  /**
@@ -1 +1 @@
1
- export declare function ModeToggle(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function ModeToggle(): import("react").JSX.Element;
@@ -65,5 +65,5 @@ export interface PageHeaderProps {
65
65
  * (`--page-header-accent`) so consumers can override it without rebuilding
66
66
  * Tailwind classes.
67
67
  */
68
- export declare function PageHeader({ title, description, icon, actions, accentColor, sticky, className, 'data-testid': testId, }: PageHeaderProps): import("react/jsx-runtime").JSX.Element;
68
+ export declare function PageHeader({ title, description, icon, actions, accentColor, sticky, className, 'data-testid': testId, }: PageHeaderProps): React.JSX.Element;
69
69
  export default PageHeader;
@@ -12,6 +12,7 @@
12
12
  *
13
13
  * @module
14
14
  */
15
+ import * as React from 'react';
15
16
  /**
16
17
  * Lazy-resolved Lucide icon — see ../utils/getIcon for impl.
17
18
  * The local symbol is kept for backwards compat with existing call sites
@@ -23,5 +24,5 @@ interface UnifiedSidebarProps {
23
24
  /** Callback when user switches apps */
24
25
  onAppChange?: (name: string) => void;
25
26
  }
26
- export declare function UnifiedSidebar({ activeAppName }: UnifiedSidebarProps): import("react/jsx-runtime").JSX.Element;
27
+ export declare function UnifiedSidebar({ activeAppName }: UnifiedSidebarProps): React.JSX.Element;
27
28
  export {};
@@ -16,20 +16,24 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
16
16
  import * as React from 'react';
17
17
  import { Link, useLocation } from 'react-router-dom';
18
18
  import { getIcon } from '../utils/getIcon';
19
- import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarGroup, SidebarGroupLabel, SidebarGroupContent, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarMenuAction, SidebarTrigger, useSidebar, } from '@object-ui/components';
19
+ import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarGroup, SidebarGroupLabel, SidebarGroupContent, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarMenuAction, useSidebar, } from '@object-ui/components';
20
20
  import { Clock, Star, StarOff, ChevronRight, Home, Layers, } from 'lucide-react';
21
21
  import { NavigationRenderer } from '@object-ui/layout';
22
22
  import { useMetadata } from '../providers/MetadataProvider';
23
23
  import { useExpressionContext, evaluateVisibility } from '../providers/ExpressionProvider';
24
24
  import { usePermissions } from '@object-ui/permissions';
25
+ import { useAuth, useIsWorkspaceAdmin } from '@object-ui/auth';
25
26
  import { useRecentItems } from '../hooks/useRecentItems';
26
27
  import { useFavorites } from '../hooks/useFavorites';
27
28
  import { useNavPins } from '../hooks/useNavPins';
29
+ import { matchAppBySegment, appRouteSegment } from '../utils';
28
30
  import { useObjectTranslation, useObjectLabel } from '@object-ui/i18n';
29
31
  // useObjectLabel provides appLabel/appDescription for convention-based
30
32
  // i18n lookup — `{ns}.apps.{name}.label` resolves to the translated label
31
33
  // loaded from /api/v1/i18n/translations/:locale.
32
34
  import { useNavigationContext } from '../context/NavigationContext';
35
+ import { useAppContextSelectors } from './ContextSelectors';
36
+ import { LocalizedSidebarTrigger } from './LocalizedSidebarTrigger';
33
37
  // ---------------------------------------------------------------------------
34
38
  // useNavOrder – localStorage-persisted drag-and-drop reorder for nav items
35
39
  // ---------------------------------------------------------------------------
@@ -84,12 +88,27 @@ function useNavOrder(appName) {
84
88
  }, [orderMap, persist]);
85
89
  return { applyOrder, handleReorder };
86
90
  }
91
+ function isMetadataDirectoryItem(item) {
92
+ return item.componentRef === 'metadata:directory';
93
+ }
94
+ function isPackagesItem(item) {
95
+ return item.componentRef === 'developer:packages';
96
+ }
97
+ function isOverviewGroup(item) {
98
+ if (item.type !== 'group')
99
+ return false;
100
+ const id = String(item.id ?? '').toLowerCase();
101
+ const label = typeof item.label === 'string' ? item.label.toLowerCase() : '';
102
+ return id === 'overview' || label === 'overview';
103
+ }
87
104
  export function UnifiedSidebar({ activeAppName }) {
88
105
  const { isMobile, setOpenMobile } = useSidebar();
89
106
  const location = useLocation();
90
107
  const { t } = useObjectTranslation();
91
108
  const { objectLabel: resolveNavObjectLabel, dashboardLabel: resolveNavDashboardLabel, navGroupLabel: resolveNavGroupLabel, viewLabel: resolveNavViewLabel } = useObjectLabel();
92
109
  const { context, currentAppName } = useNavigationContext();
110
+ const { user } = useAuth();
111
+ const isWorkspaceAdmin = useIsWorkspaceAdmin();
93
112
  // Swipe-from-left-edge gesture to open sidebar on mobile
94
113
  React.useEffect(() => {
95
114
  const EDGE_THRESHOLD = 30;
@@ -101,7 +120,8 @@ export function UnifiedSidebar({ activeAppName }) {
101
120
  const handleTouchEnd = (e) => {
102
121
  const deltaX = e.changedTouches[0].clientX - touchStartX;
103
122
  if (touchStartX < EDGE_THRESHOLD && deltaX > SWIPE_DISTANCE && isMobile) {
104
- document.querySelector('[data-sidebar="trigger"]')?.dispatchEvent(new MouseEvent('click', { bubbles: true }));
123
+ // Idempotent direct open (ADR-0054 C1) no synthetic click dispatch.
124
+ setOpenMobile(true);
105
125
  }
106
126
  };
107
127
  document.addEventListener('touchstart', handleTouchStart, { passive: true });
@@ -110,13 +130,16 @@ export function UnifiedSidebar({ activeAppName }) {
110
130
  document.removeEventListener('touchstart', handleTouchStart);
111
131
  document.removeEventListener('touchend', handleTouchEnd);
112
132
  };
113
- }, [isMobile]);
133
+ }, [isMobile, setOpenMobile]);
114
134
  const { recentItems } = useRecentItems();
115
135
  const { favorites, removeFavorite } = useFavorites();
116
136
  const { apps: metadataApps, objects: metadataObjects } = useMetadata();
117
137
  const apps = metadataApps || [];
118
- const activeApps = apps.filter((a) => a.active !== false);
119
- const activeApp = activeApps.find((a) => a.name === (activeAppName || currentAppName)) || activeApps[0];
138
+ // Filter switcher to non-hidden apps; active-app lookup spans all so
139
+ // direct navigation to /apps/account still renders.
140
+ const activeApps = apps.filter((a) => a.active !== false && a.hidden !== true);
141
+ // ADR-0048 (A) — route segment may be a package id; match by it (name fallback).
142
+ const activeApp = matchAppBySegment(apps.filter((a) => a.active !== false), activeAppName || currentAppName) || activeApps[0];
120
143
  // Drag-reorder and pin persistence
121
144
  const { applyOrder, handleReorder } = useNavOrder(activeApp?.name || 'home');
122
145
  const { togglePin, applyPins } = useNavPins();
@@ -134,17 +157,93 @@ export function UnifiedSidebar({ activeAppName }) {
134
157
  // Resolve navigation items
135
158
  const activeArea = areas.find((a) => a.id === activeAreaId);
136
159
  const appNavigation = activeArea?.navigation || activeApp?.navigation || [];
137
- // Home navigation items
138
- const homeNavigation = React.useMemo(() => [
139
- { id: 'home-dashboard', label: t('home.nav', { defaultValue: 'Home' }), type: 'url', url: '/home', icon: 'home' },
140
- ], [t]);
160
+ // App-level context selectors (e.g. Studio's package scope). Their
161
+ // values are injected into nav items as `{<id>}` template vars so a
162
+ // single dropdown transparently scopes every secondary menu.
163
+ const { contextValues, element: contextSelectorsUI } = useAppContextSelectors(activeApp?.name || 'home', activeApp?.contextSelectors, t);
164
+ // Home navigation items. For workspace admins we surface the full system
165
+ // ("Administration") nav right here on /home — previously the home context
166
+ // showed ONLY a "Home" link, so a fresh env (no apps yet) rendered a bare
167
+ // centered page with the real menu nowhere in sight. Mirrors AppSidebar's
168
+ // `systemFallbackNavigation` (sans the deprecated manual "Create App").
169
+ // Non-admins get just Home — system administration is owner/admin-gated.
170
+ const homeNavigation = React.useMemo(() => {
171
+ const items = [
172
+ { id: 'home-dashboard', label: t('home.nav', { defaultValue: 'Home' }), type: 'url', url: '/home', icon: 'home' },
173
+ // Package documentation portal (ADR-0046) — visible to all users, not
174
+ // just workspace admins, so it lives in the base items rather than the
175
+ // admin cluster below.
176
+ { id: 'docs', label: t('layout.systemNav.documentation', { defaultValue: 'Documentation' }), type: 'url', url: '/docs', icon: 'book-open' },
177
+ ];
178
+ if (isWorkspaceAdmin) {
179
+ const adminItems = [
180
+ { id: 'sys-settings', label: t('layout.systemNav.systemSettings', { defaultValue: 'System Settings' }), type: 'url', url: '/apps/setup', icon: 'settings' },
181
+ { id: 'sys-apps', label: t('layout.systemNav.applications', { defaultValue: 'Applications' }), type: 'url', url: '/apps/setup/system/apps', icon: 'layout-grid' },
182
+ { id: 'sys-marketplace', label: t('layout.systemNav.appMarketplace', { defaultValue: 'App Marketplace' }), type: 'url', url: '/apps/setup/system/marketplace', icon: 'store' },
183
+ { id: 'sys-objects', label: t('layout.systemNav.objectManager', { defaultValue: 'Object Manager' }), type: 'url', url: '/apps/setup/system/metadata/object', icon: 'database' },
184
+ { id: 'sys-datasources', label: t('layout.systemNav.datasources', { defaultValue: 'Datasources' }), type: 'url', url: '/apps/setup/component/metadata/resource?type=datasource', icon: 'database' },
185
+ { id: 'sys-users', label: t('layout.systemNav.users', { defaultValue: 'Users' }), type: 'url', url: '/apps/setup/system/users', icon: 'users' },
186
+ { id: 'sys-orgs', label: t('layout.systemNav.organizations', { defaultValue: 'Organizations' }), type: 'url', url: '/apps/setup/system/organizations', icon: 'building-2' },
187
+ { id: 'sys-roles', label: t('layout.systemNav.roles', { defaultValue: 'Roles' }), type: 'url', url: '/apps/setup/system/roles', icon: 'shield' },
188
+ { id: 'sys-config', label: t('layout.systemNav.configuration', { defaultValue: 'Configuration' }), type: 'url', url: '/apps/setup/system/settings', icon: 'sliders-horizontal' },
189
+ ];
190
+ items.push({
191
+ id: 'sys-administration',
192
+ label: t('layout.systemNav.administration', { defaultValue: 'Administration' }),
193
+ type: 'group',
194
+ icon: 'shield',
195
+ children: adminItems,
196
+ });
197
+ }
198
+ return items;
199
+ }, [t, isWorkspaceAdmin]);
141
200
  // Determine which navigation to show based on context
142
201
  const navigationItems = context === 'home' ? homeNavigation : appNavigation;
202
+ const basePath = context === 'app' && activeApp ? `/apps/${appRouteSegment(activeApp)}` : '';
203
+ const isStudioApp = context === 'app' && activeApp?.name === 'studio';
204
+ const studioHomeSearch = React.useMemo(() => {
205
+ if (!isStudioApp)
206
+ return '';
207
+ const packageId = new URLSearchParams(location.search).get('package') || contextValues.active_package;
208
+ return packageId ? `?package=${encodeURIComponent(packageId)}` : '';
209
+ }, [contextValues.active_package, isStudioApp, location.search]);
210
+ const studioNavigationItems = React.useMemo(() => {
211
+ if (context !== 'app' || activeApp?.name !== 'studio')
212
+ return navigationItems;
213
+ const packageManagementLabel = t('sidebar.packageManagement', {
214
+ defaultValue: 'Package management',
215
+ });
216
+ const walk = (items) => items.flatMap((item) => {
217
+ if (isMetadataDirectoryItem(item))
218
+ return [];
219
+ const children = item.children?.length ? walk(item.children) : item.children;
220
+ if (item.type === 'group' && children?.length === 0)
221
+ return [];
222
+ if (isPackagesItem(item)) {
223
+ return [{
224
+ ...item,
225
+ type: 'url',
226
+ label: packageManagementLabel,
227
+ url: `${basePath}/component/developer/packages${studioHomeSearch}`,
228
+ children,
229
+ }];
230
+ }
231
+ if (children !== item.children) {
232
+ return [{ ...item, children }];
233
+ }
234
+ return [item];
235
+ });
236
+ return walk(navigationItems).flatMap((item) => {
237
+ if (!isOverviewGroup(item))
238
+ return [item];
239
+ return item.children ?? [];
240
+ });
241
+ }, [activeApp?.name, basePath, context, navigationItems, studioHomeSearch, t]);
143
242
  // Apply saved order and pin state
144
243
  const processedNavigation = React.useMemo(() => {
145
- const ordered = applyOrder(navigationItems);
244
+ const ordered = applyOrder(studioNavigationItems);
146
245
  return applyPins(ordered);
147
- }, [navigationItems, applyOrder, applyPins]);
246
+ }, [studioNavigationItems, applyOrder, applyPins]);
148
247
  // Recent section collapsed by default
149
248
  const [recentExpanded, setRecentExpanded] = React.useState(false);
150
249
  // Visibility evaluation
@@ -170,14 +269,16 @@ export function UnifiedSidebar({ activeAppName }) {
170
269
  }
171
270
  return true;
172
271
  }, [registeredObjectNames]);
173
- const basePath = context === 'app' && activeApp ? `/apps/${activeApp.name}` : '';
174
- return (_jsx(_Fragment, { children: _jsxs(Sidebar, { collapsible: "icon", className: "!top-14 !h-[calc(100svh-3.5rem)]", children: [isMobile && context === 'app' && (_jsx(SidebarHeader, { className: "border-b p-1.5", children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, className: "h-9 text-sm font-medium", children: _jsxs(Link, { to: "/home", onClick: () => setOpenMobile(false), "data-testid": "mobile-sidebar-home", children: [_jsx(Home, { className: "h-4 w-4" }), _jsx("span", { children: t('home.nav', { defaultValue: 'Home' }) })] }) }) }) }) })), _jsx(SidebarContent, { className: "pt-2", children: _jsx("div", { className: "transition-opacity duration-200 ease-in-out", children: context === 'app' && activeApp ? (_jsxs(_Fragment, { children: [areas.length > 1 && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5", children: [_jsx(Layers, { className: "h-3.5 w-3.5" }), t('sidebar.area', { defaultValue: 'Area' })] }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: areas.map((area) => {
272
+ const isStudioHomeActive = isStudioApp && location.pathname.replace(/\/+$/, '') === basePath;
273
+ return (_jsx(_Fragment, { children: _jsxs(Sidebar, { collapsible: "icon", className: "!top-14 !h-[calc(100svh-3.5rem)]", children: [isMobile && context === 'app' && (_jsx(SidebarHeader, { className: "border-b p-1.5", children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, className: "min-h-[44px] text-[15px] font-medium rounded-xl", children: _jsxs(Link, { to: "/home", onClick: () => setOpenMobile(false), "data-testid": "mobile-sidebar-home", children: [_jsx(Home, { className: "h-5 w-5" }), _jsx("span", { children: t('home.nav', { defaultValue: 'Home' }) })] }) }) }) }) })), _jsx(SidebarContent, { className: "pt-2", children: _jsx("div", { className: "transition-opacity duration-200 ease-in-out", children: context === 'app' && activeApp ? (_jsxs(_Fragment, { children: [contextSelectorsUI && (_jsx(SidebarGroup, { className: "group-data-[state=collapsed]:hidden px-2 pb-1", children: _jsx("div", { className: "rounded-lg border border-sidebar-border/70 bg-sidebar-accent/25 p-1.5 shadow-xs", children: _jsx(SidebarGroupContent, { children: contextSelectorsUI }) }) })), isStudioApp && (_jsx(SidebarGroup, { children: _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: isStudioHomeActive, tooltip: t('home.nav', { defaultValue: 'Home' }), children: _jsxs(Link, { to: { pathname: basePath, search: studioHomeSearch }, children: [_jsx(Home, { className: "h-4 w-4" }), _jsx("span", { children: t('home.nav', { defaultValue: 'Home' }) })] }) }) }) }) }) })), areas.length > 1 && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5", children: [_jsx(Layers, { className: "h-3.5 w-3.5" }), t('sidebar.area', { defaultValue: 'Area' })] }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: areas.map((area) => {
175
274
  const AreaIcon = getIcon(area.icon);
176
275
  const isActiveArea = area.id === activeAreaId;
177
276
  return (_jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { isActive: isActiveArea, tooltip: area.label, onClick: () => setActiveAreaId(area.id), children: [_jsx(AreaIcon, { className: "h-4 w-4" }), _jsx("span", { children: area.label })] }) }, area.id));
178
- }) }) })] })), _jsx(NavigationRenderer, { items: processedNavigation, basePath: basePath, evaluateVisibility: evalVis, checkPermission: checkPerm, checkCapability: checkCap, enablePinning: !isMobile, onPinToggle: togglePin, enableReorder: !isMobile, onReorder: handleReorder, resolveObjectLabel: (objectName, fallback) => resolveNavObjectLabel({ name: objectName, label: fallback }), resolveDashboardLabel: (dashboardName, fallback) => resolveNavDashboardLabel({ name: dashboardName, label: fallback }), resolveGroupLabel: activeApp ? (groupId, fallback) => resolveNavGroupLabel(activeApp.name, groupId, fallback) : undefined, resolveItemLabel: activeApp ? (itemId, fallback) => resolveNavGroupLabel(activeApp.name, itemId, fallback) : undefined, resolveViewLabel: (objectName, viewName, fallback) => resolveNavViewLabel(objectName, viewName, fallback), t: t }), recentItems.length > 0 && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5 cursor-pointer select-none", onClick: () => setRecentExpanded(prev => !prev), children: [_jsx(ChevronRight, { className: `h-3 w-3 transition-transform duration-150 ${recentExpanded ? 'rotate-90' : ''}` }), _jsx(Clock, { className: "h-3.5 w-3.5" }), t('sidebar.recent', { defaultValue: 'Recent' })] }), recentExpanded && (_jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: recentItems.slice(0, 5).map(item => (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, children: _jsxs(Link, { to: item.href, children: [_jsx("span", { className: "text-muted-foreground", children: item.type === 'dashboard' ? '📊' : item.type === 'report' ? '📈' : '📄' }), _jsx("span", { className: "truncate", children: item.label })] }) }) }, item.id))) }) }))] })), favorites.some(f => f.type !== 'nav') && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5", children: [_jsx(Star, { className: "h-3.5 w-3.5" }), t('sidebar.favorites', { defaultValue: 'Favorites' })] }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: favorites.filter(f => f.type !== 'nav').slice(0, 8).map(item => (_jsxs(SidebarMenuItem, { children: [_jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, children: _jsxs(Link, { to: item.href, children: [_jsx("span", { className: "text-muted-foreground", children: item.type === 'dashboard' ? '📊' : item.type === 'report' ? '📈' : item.type === 'page' ? '📄' : '📋' }), _jsx("span", { className: "truncate", children: item.label })] }) }), _jsx(SidebarMenuAction, { showOnHover: true, onClick: (e) => { e.stopPropagation(); removeFavorite(item.id); }, "aria-label": t('sidebar.removeFromFavorites', { defaultValue: 'Remove {{name}} from favorites', name: item.label }), children: _jsx(StarOff, { className: "h-3 w-3" }) })] }, item.id))) }) })] }))] })) : (_jsxs(_Fragment, { children: [_jsx(SidebarGroup, { children: _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: homeNavigation.map((item) => {
277
+ }) }) })] })), _jsx(NavigationRenderer, { items: processedNavigation, basePath: basePath, evaluateVisibility: evalVis, checkPermission: checkPerm, checkCapability: checkCap, enablePinning: !isMobile, onPinToggle: togglePin, enableReorder: !isMobile, onReorder: handleReorder, resolveObjectLabel: (objectName, fallback) => resolveNavObjectLabel({ name: objectName, label: fallback }), resolveDashboardLabel: (dashboardName, fallback) => resolveNavDashboardLabel({ name: dashboardName, label: fallback }), resolveGroupLabel: activeApp ? (groupId, fallback) => resolveNavGroupLabel(activeApp.name, groupId, fallback) : undefined, resolveItemLabel: activeApp ? (itemId, fallback) => (activeApp.name === 'studio' && fallback === t('sidebar.packageManagement', { defaultValue: 'Package management' })
278
+ ? fallback
279
+ : resolveNavGroupLabel(activeApp.name, itemId, fallback)) : undefined, resolveViewLabel: (objectName, viewName, fallback) => resolveNavViewLabel(objectName, viewName, fallback), t: t, templateContext: { currentUserId: user?.id ?? null, contextValues } }), recentItems.length > 0 && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5 cursor-pointer select-none", onClick: () => setRecentExpanded(prev => !prev), children: [_jsx(ChevronRight, { className: `h-3 w-3 transition-transform duration-150 ${recentExpanded ? 'rotate-90' : ''}` }), _jsx(Clock, { className: "h-3.5 w-3.5" }), t('sidebar.recent', { defaultValue: 'Recent' })] }), recentExpanded && (_jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: recentItems.slice(0, 5).map(item => (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, children: _jsxs(Link, { to: item.href, children: [_jsx("span", { className: "text-muted-foreground", children: item.type === 'dashboard' ? '📊' : item.type === 'report' ? '📈' : '📄' }), _jsx("span", { className: "truncate", children: item.label })] }) }) }, item.id))) }) }))] })), favorites.some(f => f.type !== 'nav') && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5", children: [_jsx(Star, { className: "h-3.5 w-3.5" }), t('sidebar.favorites', { defaultValue: 'Favorites' })] }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: favorites.filter(f => f.type !== 'nav').slice(0, 8).map(item => (_jsxs(SidebarMenuItem, { children: [_jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, children: _jsxs(Link, { to: item.href, children: [_jsx("span", { className: "text-muted-foreground", children: item.type === 'dashboard' ? '📊' : item.type === 'report' ? '📈' : item.type === 'page' ? '📄' : '📋' }), _jsx("span", { className: "truncate", children: item.label })] }) }), _jsx(SidebarMenuAction, { showOnHover: true, onClick: (e) => { e.stopPropagation(); removeFavorite(item.id); }, "aria-label": t('sidebar.removeFromFavorites', { defaultValue: 'Remove {{name}} from favorites', name: item.label }), children: _jsx(StarOff, { className: "h-3 w-3" }) })] }, item.id))) }) })] }))] })) : (_jsxs(_Fragment, { children: [_jsx(SidebarGroup, { children: _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: homeNavigation.map((item) => {
179
280
  const NavIcon = getIcon(item.icon);
180
281
  const isActive = location.pathname === item.url;
181
282
  return (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, isActive: isActive, children: _jsxs(Link, { to: item.url || '/home', children: [_jsx(NavIcon, { className: "h-4 w-4" }), _jsx("span", { children: item.label })] }) }) }, item.id));
182
- }) }) }) }), favorites.filter(f => f.type === 'object' || f.type === 'dashboard' || f.type === 'page').length > 0 && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5", children: [_jsx(Star, { className: "h-3.5 w-3.5" }), t('sidebar.starred', { defaultValue: 'Starred' })] }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: favorites.filter(f => f.type === 'object' || f.type === 'dashboard' || f.type === 'page').slice(0, 8).map(item => (_jsxs(SidebarMenuItem, { children: [_jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, children: _jsxs(Link, { to: item.href, children: [_jsx("span", { className: "text-muted-foreground", children: item.type === 'dashboard' ? '📊' : item.type === 'page' ? '📄' : '📋' }), _jsx("span", { className: "truncate", children: item.label })] }) }), _jsx(SidebarMenuAction, { showOnHover: true, onClick: (e) => { e.stopPropagation(); removeFavorite(item.id); }, "aria-label": t('sidebar.removeFromFavorites', { defaultValue: 'Remove {{name}} from favorites', name: item.label }), children: _jsx(StarOff, { className: "h-3 w-3" }) })] }, item.id))) }) })] }))] })) }) }), _jsx(SidebarFooter, { className: "border-t p-1", children: _jsx(SidebarTrigger, { className: "w-full justify-start pl-2 group-data-[state=collapsed]:justify-center group-data-[state=collapsed]:pl-0" }) })] }) }));
283
+ }) }) }) }), favorites.filter(f => f.type === 'object' || f.type === 'dashboard' || f.type === 'page').length > 0 && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5", children: [_jsx(Star, { className: "h-3.5 w-3.5" }), t('sidebar.starred', { defaultValue: 'Starred' })] }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: favorites.filter(f => f.type === 'object' || f.type === 'dashboard' || f.type === 'page').slice(0, 8).map(item => (_jsxs(SidebarMenuItem, { children: [_jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, children: _jsxs(Link, { to: item.href, children: [_jsx("span", { className: "text-muted-foreground", children: item.type === 'dashboard' ? '📊' : item.type === 'page' ? '📄' : '📋' }), _jsx("span", { className: "truncate", children: item.label })] }) }), _jsx(SidebarMenuAction, { showOnHover: true, onClick: (e) => { e.stopPropagation(); removeFavorite(item.id); }, "aria-label": t('sidebar.removeFromFavorites', { defaultValue: 'Remove {{name}} from favorites', name: item.label }), children: _jsx(StarOff, { className: "h-3 w-3" }) })] }, item.id))) }) })] }))] })) }) }), _jsx(SidebarFooter, { className: "border-t p-1", children: _jsx(LocalizedSidebarTrigger, { className: "w-full justify-start pl-2 group-data-[state=collapsed]:justify-center group-data-[state=collapsed]:pl-0" }) })] }) }));
183
284
  }
@@ -7,3 +7,4 @@
7
7
  * @module
8
8
  */
9
9
  export { initSentry, captureError, setSentryUser, getSentry } from './sentry';
10
+ export { beginRequest, endRequest, getPendingRequests, isIdle, subscribeSettle, whenIdle, withSettleSignal, installSettleSignalGlobal, type ObjectUiGlobal, } from './settleSignal';
@@ -7,3 +7,4 @@
7
7
  * @module
8
8
  */
9
9
  export { initSentry, captureError, setSentryUser, getSentry } from './sentry';
10
+ export { beginRequest, endRequest, getPendingRequests, isIdle, subscribeSettle, whenIdle, withSettleSignal, installSettleSignalGlobal, } from './settleSignal';