@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
@@ -1,15 +1,22 @@
1
1
  /**
2
- * ViewConfigPanel — Airtable-style simplified configuration panel.
2
+ * ViewConfigPanel — the runtime ObjectView's right-rail "view editor".
3
3
  *
4
- * Renders a focused, opinionated set of sections (Page / Data /
5
- * Appearance / Toolbar / User actions / Navigation / Advanced) — matching
6
- * Airtable's Interface designer right rail. Power-user sections (records,
7
- * sharing, accessibility) are intentionally excluded to keep the panel
8
- * approachable; they can be re-introduced later as a dedicated "advanced"
9
- * settings dialog if needed.
4
+ * MIGRATED: this panel now hosts the studio's spec-driven
5
+ * {@link ViewVariantInspector} instead of the legacy `buildViewConfigSchema`
6
+ * engine, so the runtime and the metadata studio share ONE inspector. The
7
+ * inspector renders the per-view-type config fields straight from
8
+ * `@objectstack/spec` (grid / kanban / calendar / gallery / …) plus the
9
+ * shared column / filter / sort / toolbar sections.
10
10
  *
11
- * All changes are buffered in a local draft state. Clicking Save commits
12
- * the draft via onSave; Discard resets to the original activeView.
11
+ * The runtime ObjectView keeps the active view as a FLAT NamedListView; the
12
+ * inspector authors a canonical ViewItem draft. {@link view-config-adapter}
13
+ * bridges the two shapes so the `sys_view` persistence path is untouched:
14
+ * edits live as a ViewItem draft while the panel is open, then flatten back
15
+ * to the runtime view shape on update / save / create.
16
+ *
17
+ * Field loading is network-free: `objectDef.fields` is mapped into the
18
+ * inspector's `objectFieldsOverride` so neither the inspector nor its
19
+ * column editor issue a `client.get('object', …)` request.
13
20
  */
14
21
  /** Editor panel types that can be opened from clickable rows */
15
22
  export type EditorPanelType = 'columns' | 'filter' | 'sort';
@@ -29,13 +36,6 @@ export interface ViewConfigPanelProps {
29
36
  filter?: any[];
30
37
  sort?: any[];
31
38
  description?: string;
32
- showSearch?: boolean;
33
- showFilters?: boolean;
34
- showSort?: boolean;
35
- allowExport?: boolean;
36
- showDescription?: boolean;
37
- addRecordViaForm?: boolean;
38
- exportOptions?: any;
39
39
  [key: string]: any;
40
40
  };
41
41
  /** The object definition */
@@ -54,5 +54,12 @@ export interface ViewConfigPanelProps {
54
54
  onSave?: (draft: Record<string, any>) => void;
55
55
  /** Called when create-mode view is created */
56
56
  onCreate?: (config: Record<string, any>) => void;
57
+ /**
58
+ * Studio metadata client — drives saves and the ADR-0034 draft/publish
59
+ * chrome ({@link RuntimeDraftBar}).
60
+ */
61
+ metadataClient?: any;
62
+ /** Called after a publish / discard so the host can refresh its read. */
63
+ onAfterChange?: () => void;
57
64
  }
58
- export declare function ViewConfigPanel({ open, onClose, mode, activeView, objectDef, onViewUpdate, onSave, onCreate }: ViewConfigPanelProps): import("react/jsx-runtime").JSX.Element;
65
+ export declare function ViewConfigPanel({ open, onClose, mode, activeView, objectDef, onViewUpdate, onSave, onCreate, metadataClient, onAfterChange }: ViewConfigPanelProps): import("react").JSX.Element;
@@ -1,112 +1,156 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * ViewConfigPanel — Airtable-style simplified configuration panel.
3
+ * ViewConfigPanel — the runtime ObjectView's right-rail "view editor".
4
4
  *
5
- * Renders a focused, opinionated set of sections (Page / Data /
6
- * Appearance / Toolbar / User actions / Navigation / Advanced) — matching
7
- * Airtable's Interface designer right rail. Power-user sections (records,
8
- * sharing, accessibility) are intentionally excluded to keep the panel
9
- * approachable; they can be re-introduced later as a dedicated "advanced"
10
- * settings dialog if needed.
5
+ * MIGRATED: this panel now hosts the studio's spec-driven
6
+ * {@link ViewVariantInspector} instead of the legacy `buildViewConfigSchema`
7
+ * engine, so the runtime and the metadata studio share ONE inspector. The
8
+ * inspector renders the per-view-type config fields straight from
9
+ * `@objectstack/spec` (grid / kanban / calendar / gallery / …) plus the
10
+ * shared column / filter / sort / toolbar sections.
11
11
  *
12
- * All changes are buffered in a local draft state. Clicking Save commits
13
- * the draft via onSave; Discard resets to the original activeView.
12
+ * The runtime ObjectView keeps the active view as a FLAT NamedListView; the
13
+ * inspector authors a canonical ViewItem draft. {@link view-config-adapter}
14
+ * bridges the two shapes so the `sys_view` persistence path is untouched:
15
+ * edits live as a ViewItem draft while the panel is open, then flatten back
16
+ * to the runtime view shape on update / save / create.
17
+ *
18
+ * Field loading is network-free: `objectDef.fields` is mapped into the
19
+ * inspector's `objectFieldsOverride` so neither the inspector nor its
20
+ * column editor issue a `client.get('object', …)` request.
14
21
  */
15
22
  import { useMemo, useEffect, useRef, useCallback, useState } from 'react';
16
- import { ConfigPanelRenderer, useConfigDraft, Button } from '@object-ui/components';
17
- import { Settings2 } from 'lucide-react';
23
+ import { Button } from '@object-ui/components';
18
24
  import { useObjectTranslation } from '@object-ui/i18n';
19
- import { buildViewConfigSchema, deriveFieldOptions, toFilterGroup, toSortItems, VIEW_TYPE_LABELS, } from '@object-ui/plugin-view';
20
- export function ViewConfigPanel({ open, onClose, mode = 'edit', activeView, objectDef, onViewUpdate, onSave, onCreate }) {
25
+ import { ViewVariantInspector } from './metadata-admin/inspectors/ViewVariantInspector';
26
+ import { RuntimeDraftBar } from './RuntimeDraftBar';
27
+ import { isFormFamilyKey } from './metadata-admin/view-variant-model';
28
+ import { detectLocale } from './metadata-admin/i18n';
29
+ import { runtimeViewToInspectorDraft, inspectorDraftToRuntimeView, } from './view-config-adapter';
30
+ /**
31
+ * Map an Object definition's `fields` record into the inspector's flat field
32
+ * catalog so it can render field-reference pickers (columns, groupByField, …)
33
+ * without a network fetch.
34
+ */
35
+ function mapObjectFields(objectDef) {
36
+ const fields = objectDef.fields;
37
+ if (!fields || typeof fields !== 'object')
38
+ return [];
39
+ return Object.entries(fields).map(([name, def]) => {
40
+ const f = (def ?? {});
41
+ return {
42
+ name,
43
+ label: typeof f.label === 'string' && f.label ? f.label : name,
44
+ type: typeof f.type === 'string' ? f.type : 'text',
45
+ hidden: f.hidden === true,
46
+ };
47
+ });
48
+ }
49
+ export function ViewConfigPanel({ open, onClose, mode = 'edit', activeView, objectDef, onViewUpdate, onSave, onCreate, metadataClient, onAfterChange }) {
21
50
  const { t } = useObjectTranslation();
22
51
  const panelRef = useRef(null);
23
- // "Show advanced settings" when false (default), the panel only shows
24
- // the Airtable-essential subset. When true, every section/field is
25
- // surfaced for power users. Reset whenever the panel closes so reopening
26
- // returns to the simplified view.
27
- const [showAdvanced, setShowAdvanced] = useState(false);
28
- useEffect(() => {
29
- if (!open)
30
- setShowAdvanced(false);
31
- }, [open]);
32
- // Default empty view for create mode
52
+ const locale = useMemo(() => detectLocale(), []);
53
+ // Provisional id for a create-mode view. A lazy useState initializer runs
54
+ // exactly once, keeping the impure `Date.now()` out of render; the backend
55
+ // assigns the real `name` on create, so this only needs to be unique
56
+ // within the draft.
57
+ const [newViewId] = useState(() => `view_${Date.now()}`);
58
+ // Default empty view used to seed create mode.
33
59
  const defaultNewView = useMemo(() => ({
34
- id: `view_${Date.now()}`,
60
+ id: newViewId,
35
61
  label: t('console.objectView.newView'),
36
62
  type: 'grid',
37
63
  columns: [],
38
64
  filter: [],
39
65
  sort: [],
40
- showSearch: true,
41
- showFilters: true,
42
- showSort: true,
43
66
  }), []); // eslint-disable-line react-hooks/exhaustive-deps
44
- // Stabilize source reference: only change when view ID changes.
45
- // This prevents useConfigDraft from resetting on every parent re-render
46
- // (same behavior as original useEffect with [activeView.id] dependency).
67
+ // Inspector draft state. Rebuilt only when the source view ID (or create
68
+ // mode) changes not on every parent re-render — so in-flight edits are
69
+ // not clobbered (same stabilization the legacy panel used with stableKey).
47
70
  const stableKey = mode === 'create' ? 'create' : activeView.id;
48
- const stableActiveView = useMemo(() => ({ ...activeView }), [stableKey]);
49
- const effectiveActiveView = mode === 'create' ? defaultNewView : stableActiveView;
50
- // Schema-driven draft state management
51
- const { draft, isDirty, updateField, discard, undo, redo, canUndo, canRedo } = useConfigDraft(effectiveActiveView, {
52
- mode,
53
- onUpdate: onViewUpdate,
54
- });
55
- // Focus the panel when it opens for keyboard accessibility
71
+ const initialDraft = useMemo(() => runtimeViewToInspectorDraft(mode === 'create' ? defaultNewView : activeView, objectDef.name), [stableKey, objectDef.name]);
72
+ const [draft, setDraft] = useState(initialDraft);
73
+ const [isDirty, setIsDirty] = useState(false);
74
+ // Bumped on each edit-mode save so the draft/publish chrome surfaces the
75
+ // "unpublished changes" indicator immediately (the save writes a draft).
76
+ const [savedSignal, setSavedSignal] = useState(0);
77
+ // Mirror the committed draft into a ref so `handlePatch` can compute the
78
+ // next draft synchronously without a side-effecting state updater.
79
+ const draftRef = useRef(draft);
80
+ // Reset the draft when the source view changes — derived from `initialDraft`
81
+ // during render (React's "adjust state on prop change" pattern) rather than
82
+ // in an effect, so there's no extra render pass.
83
+ const lastDraftRef = useRef(initialDraft);
84
+ if (lastDraftRef.current !== initialDraft) {
85
+ lastDraftRef.current = initialDraft;
86
+ draftRef.current = initialDraft;
87
+ setDraft(initialDraft);
88
+ setIsDirty(false);
89
+ }
90
+ useEffect(() => { draftRef.current = draft; }, [draft]);
91
+ // Focus the panel when it opens for keyboard accessibility.
56
92
  useEffect(() => {
57
93
  if (open && panelRef.current) {
58
94
  panelRef.current.focus();
59
95
  }
60
96
  }, [open]);
61
- // Derive field options from objectDef
62
- const fieldOptions = useMemo(() => deriveFieldOptions(objectDef), [objectDef.fields]);
63
- // Bridge: filter/sort builder format
64
- const filterGroupValue = useMemo(() => toFilterGroup(draft.filter), [draft.filter]);
65
- const sortItemsValue = useMemo(() => toSortItems(draft.sort), [draft.sort]);
66
- // Build schema. essentialOnly is the default; the user can opt-in to the
67
- // full advanced surface via the "Show advanced settings" toggle below.
68
- const schema = useMemo(() => buildViewConfigSchema({
69
- t,
70
- fieldOptions,
71
- objectDef,
72
- updateField,
73
- filterGroupValue,
74
- sortItemsValue,
75
- essentialOnly: !showAdvanced,
76
- }), [t, fieldOptions, objectDef, updateField, filterGroupValue, sortItemsValue, showAdvanced]);
77
- // Override breadcrumb with dynamic view type
78
- const viewType = draft.type || 'grid';
79
- const dynamicSchema = useMemo(() => ({
80
- ...schema,
81
- breadcrumb: [t('console.objectView.page'), VIEW_TYPE_LABELS[viewType] || viewType],
82
- }), [schema, t, viewType]);
83
- // Save/discard handlers with create mode support
97
+ // Network-free field catalog sourced from the object definition the host
98
+ // already holds.
99
+ const objectFields = useMemo(() => mapObjectFields(objectDef), [objectDef.fields]); // eslint-disable-line react-hooks/exhaustive-deps
100
+ const familyKey = isFormFamilyKey(draft.viewKind) ? 'form' : 'list';
101
+ // Shallow-merge an inspector patch into the draft, then mirror the
102
+ // flattened runtime view back to the host field-by-field (matching the
103
+ // legacy onViewUpdate(field, value) contract ObjectView expects).
104
+ const handlePatch = useCallback((patch) => {
105
+ const next = { ...draftRef.current, ...patch };
106
+ draftRef.current = next;
107
+ setDraft(next);
108
+ setIsDirty(true);
109
+ if (onViewUpdate) {
110
+ const flat = inspectorDraftToRuntimeView(next);
111
+ for (const [field, value] of Object.entries(flat)) {
112
+ if (field === 'id')
113
+ continue;
114
+ onViewUpdate(field, value);
115
+ }
116
+ }
117
+ }, [onViewUpdate]);
84
118
  const handleSave = useCallback(() => {
119
+ const flat = inspectorDraftToRuntimeView(draft);
85
120
  if (mode === 'create') {
86
- onCreate?.(draft);
121
+ onCreate?.(flat);
87
122
  }
88
123
  else {
89
- onSave?.(draft);
124
+ onSave?.(flat);
125
+ setSavedSignal((s) => s + 1);
90
126
  }
91
- // Clear dirty state after save while preserving draft values
92
- discard();
93
- }, [draft, onSave, onCreate, mode, discard]);
127
+ setIsDirty(false);
128
+ }, [draft, onSave, onCreate, mode]);
94
129
  const handleDiscard = useCallback(() => {
95
130
  if (mode === 'create') {
96
131
  onClose();
97
132
  return;
98
133
  }
99
- discard();
100
- }, [discard, mode, onClose]);
134
+ setDraft(initialDraft);
135
+ setIsDirty(false);
136
+ }, [initialDraft, mode, onClose]);
137
+ // ADR-0034 (#1515): resume a pending draft into the inspector when the
138
+ // panel reopens (flag-ON only; the bar never fires this when the flag is
139
+ // off). The stored body is the flat runtime view, so adapt it back to the
140
+ // inspector draft shape before seeding.
141
+ const handleResumeDraft = useCallback((body) => {
142
+ const resumed = runtimeViewToInspectorDraft(body, objectDef.name);
143
+ draftRef.current = resumed;
144
+ setDraft(resumed);
145
+ setIsDirty(false);
146
+ }, [objectDef.name]);
101
147
  const panelTitle = mode === 'create'
102
148
  ? t('console.objectView.createView')
103
149
  : t('console.objectView.configureView');
104
- // Header-extra: "Show advanced" toggle button. Subtle gear icon button
105
- // sitting next to undo/redo/close clearly affordant but not visually
106
- // dominant. Title swaps between "Show advanced settings" and "Show fewer
107
- // settings" so the user always knows what the next click will do.
108
- const advancedToggle = (_jsx(Button, { size: "sm", variant: showAdvanced ? 'secondary' : 'ghost', onClick: () => setShowAdvanced(v => !v), className: "h-7 w-7 p-0", "data-testid": "view-config-advanced-toggle", "aria-pressed": showAdvanced, title: showAdvanced
109
- ? t('console.objectView.showFewerSettings', { defaultValue: 'Show fewer settings' })
110
- : t('console.objectView.showAdvancedSettings', { defaultValue: 'Show advanced settings' }), children: _jsx(Settings2, { className: "h-3.5 w-3.5" }) }));
111
- return (_jsx(ConfigPanelRenderer, { open: open, onClose: onClose, schema: dynamicSchema, draft: draft, isDirty: isDirty, onFieldChange: updateField, onSave: handleSave, onDiscard: handleDiscard, onUndo: undo, onRedo: redo, canUndo: canUndo, canRedo: canRedo, undoLabel: t('designer.undo'), redoLabel: t('designer.redo'), objectDef: objectDef, saveLabel: t('console.objectView.save'), discardLabel: t('console.objectView.discard'), panelRef: panelRef, role: "complementary", ariaLabel: panelTitle, tabIndex: -1, testId: "view-config-panel", closeTitle: t('console.objectView.closePanel'), footerTestId: "view-config-footer", saveTestId: "view-config-save", discardTestId: "view-config-discard", headerExtra: advancedToggle, className: "transition-all overflow-hidden" }));
150
+ if (!open) {
151
+ // Keep the slide container (owned by ObjectView) able to collapse to
152
+ // zero width without rendering inspector internals while hidden.
153
+ return _jsx("div", { ref: panelRef, tabIndex: -1, "data-testid": "view-config-panel", "aria-hidden": true });
154
+ }
155
+ return (_jsxs("div", { ref: panelRef, tabIndex: -1, role: "complementary", "aria-label": panelTitle, "data-testid": "view-config-panel", className: "flex h-full flex-col", children: [_jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: _jsx(ViewVariantInspector, { type: "view", name: draft.name, draft: draft, variantKey: "config", familyKey: familyKey, isHome: true, readOnly: false, locale: locale, objectFieldsOverride: objectFields, onPatch: handlePatch }) }), _jsxs("div", { "data-testid": "view-config-footer", className: "flex items-center justify-end gap-2 border-t px-4 py-2.5", children: [mode === 'edit' && (_jsx(RuntimeDraftBar, { type: "view", name: activeView.id, metadataClient: metadataClient, dirty: isDirty, onResume: handleResumeDraft, savedSignal: savedSignal, onAfterChange: onAfterChange })), _jsx(Button, { variant: "ghost", size: "sm", onClick: handleDiscard, "data-testid": "view-config-discard", children: t('console.objectView.discard') }), _jsx(Button, { size: "sm", onClick: handleSave, disabled: mode === 'edit' && !isDirty, "data-testid": "view-config-save", children: t('console.objectView.save') })] })] }));
112
156
  }
@@ -8,7 +8,7 @@ export { ReportView } from './ReportView';
8
8
  export { SearchResultsPage } from './SearchResultsPage';
9
9
  export { ActionConfirmDialog } from './ActionConfirmDialog';
10
10
  export { ActionParamDialog } from './ActionParamDialog';
11
+ export { ActionResultDialog, type ResultDialogState } from './ActionResultDialog';
11
12
  export { MetadataToggle, MetadataPanel } from './MetadataInspector';
12
13
  export { ViewConfigPanel } from './ViewConfigPanel';
13
14
  export { CreateViewDialog } from './CreateViewDialog';
14
- export { DesignDrawer } from './DesignDrawer';
@@ -7,7 +7,7 @@ export { ReportView } from './ReportView';
7
7
  export { SearchResultsPage } from './SearchResultsPage';
8
8
  export { ActionConfirmDialog } from './ActionConfirmDialog';
9
9
  export { ActionParamDialog } from './ActionParamDialog';
10
+ export { ActionResultDialog } from './ActionResultDialog';
10
11
  export { MetadataToggle, MetadataPanel } from './MetadataInspector';
11
12
  export { ViewConfigPanel } from './ViewConfigPanel';
12
13
  export { CreateViewDialog } from './CreateViewDialog';
13
- export { DesignDrawer } from './DesignDrawer';
@@ -0,0 +1,28 @@
1
+ /**
2
+ * AuditPanel — ADR-0010 §3.6 / Phase 4.1 protection-audit trail.
3
+ *
4
+ * Renders the rows in `sys_metadata_audit` for a single metadata
5
+ * item (type + name): every save/publish/rollback/delete/reset
6
+ * attempt, with the lock state at the moment of the call and the
7
+ * decision (`allowed` / `denied` / `forced`). This is the compliance
8
+ * surface promised by the metadata-protection ADR — denied attempts
9
+ * never reach the regular history log, so this is the only place
10
+ * where blocked writes are visible.
11
+ *
12
+ * Data source: `client.audit(type, name)` →
13
+ * `GET /api/v1/meta/:type/:name/audit`.
14
+ *
15
+ * Empty state is friendly: a fresh install has no rows because the
16
+ * audit writer only fires on actual write attempts, so "no events"
17
+ * just means nobody has tried to change this item.
18
+ */
19
+ import * as React from 'react';
20
+ import type { MetadataClient } from '@object-ui/data-objectstack';
21
+ import { type SupportedLocale } from './i18n';
22
+ export interface AuditPanelProps {
23
+ type: string;
24
+ name: string;
25
+ client: MetadataClient;
26
+ locale?: SupportedLocale | string;
27
+ }
28
+ export declare function AuditPanel({ type, name, client, locale, }: AuditPanelProps): React.JSX.Element;
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * AuditPanel — ADR-0010 §3.6 / Phase 4.1 protection-audit trail.
5
+ *
6
+ * Renders the rows in `sys_metadata_audit` for a single metadata
7
+ * item (type + name): every save/publish/rollback/delete/reset
8
+ * attempt, with the lock state at the moment of the call and the
9
+ * decision (`allowed` / `denied` / `forced`). This is the compliance
10
+ * surface promised by the metadata-protection ADR — denied attempts
11
+ * never reach the regular history log, so this is the only place
12
+ * where blocked writes are visible.
13
+ *
14
+ * Data source: `client.audit(type, name)` →
15
+ * `GET /api/v1/meta/:type/:name/audit`.
16
+ *
17
+ * Empty state is friendly: a fresh install has no rows because the
18
+ * audit writer only fires on actual write attempts, so "no events"
19
+ * just means nobody has tried to change this item.
20
+ */
21
+ import * as React from 'react';
22
+ import { RefreshCw, Loader2, ShieldCheck, ShieldAlert, ShieldX } from 'lucide-react';
23
+ import { Button } from '@object-ui/components';
24
+ import { Badge } from '@object-ui/components';
25
+ import { Empty, EmptyTitle, EmptyDescription } from '@object-ui/components';
26
+ import { t } from './i18n';
27
+ function fmtTime(iso) {
28
+ if (!iso)
29
+ return '';
30
+ const d = new Date(iso);
31
+ if (Number.isNaN(d.getTime()))
32
+ return iso;
33
+ return d.toLocaleString();
34
+ }
35
+ function outcomeBadge(outcome) {
36
+ const map = {
37
+ allowed: {
38
+ label: 'allowed',
39
+ cls: 'bg-emerald-50 text-emerald-700 border-emerald-200',
40
+ Icon: ShieldCheck,
41
+ },
42
+ denied: {
43
+ label: 'denied',
44
+ cls: 'bg-rose-50 text-rose-700 border-rose-200',
45
+ Icon: ShieldX,
46
+ },
47
+ forced: {
48
+ label: 'forced',
49
+ cls: 'bg-amber-50 text-amber-700 border-amber-200',
50
+ Icon: ShieldAlert,
51
+ },
52
+ };
53
+ const v = map[outcome] ?? map.allowed;
54
+ return (_jsxs("span", { className: `inline-flex items-center gap-1 rounded border px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide ${v.cls}`, children: [_jsx(v.Icon, { className: "h-3 w-3" }), v.label] }));
55
+ }
56
+ export function AuditPanel({ type, name, client, locale = 'en-US', }) {
57
+ const [loading, setLoading] = React.useState(false);
58
+ const [error, setError] = React.useState(null);
59
+ const [events, setEvents] = React.useState(null);
60
+ const load = React.useCallback(async () => {
61
+ setLoading(true);
62
+ setError(null);
63
+ try {
64
+ const res = await client.audit(type, name, { limit: 100 });
65
+ setEvents(res.events ?? []);
66
+ }
67
+ catch (err) {
68
+ setError(String(err?.message ?? err));
69
+ setEvents([]);
70
+ }
71
+ finally {
72
+ setLoading(false);
73
+ }
74
+ }, [client, type, name]);
75
+ React.useEffect(() => {
76
+ void load();
77
+ }, [load]);
78
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex items-center justify-between border-b px-1 pb-2", children: [_jsxs("div", { className: "text-xs text-muted-foreground", children: [events?.length ?? 0, " ", t('engine.edit.auditCount', locale)] }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: () => void load(), disabled: loading, className: "h-7 gap-1 text-xs", title: t('engine.edit.refresh', locale), children: [loading ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin" })) : (_jsx(RefreshCw, { className: "h-3 w-3" })), t('engine.edit.refresh', locale)] })] }), error && (_jsx("div", { className: "m-2 rounded border border-rose-200 bg-rose-50 p-2 text-xs text-rose-700", children: error })), _jsx("div", { className: "flex-1 overflow-auto", children: loading && (!events || events.length === 0) ? (_jsxs("div", { className: "flex h-32 items-center justify-center text-xs text-muted-foreground", children: [_jsx(Loader2, { className: "mr-2 h-3 w-3 animate-spin" }), t('engine.edit.loading', locale)] })) : !events || events.length === 0 ? (_jsxs(Empty, { className: "py-10", children: [_jsx(EmptyTitle, { children: t('engine.edit.auditEmptyTitle', locale) }), _jsx(EmptyDescription, { children: t('engine.edit.auditEmptyDescription', locale) })] })) : (_jsxs("table", { className: "w-full text-xs", children: [_jsx("thead", { className: "sticky top-0 bg-muted/40 text-left text-[10px] uppercase tracking-wide text-muted-foreground", children: _jsxs("tr", { children: [_jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColTime', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColActor', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColOperation', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColOutcome', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColLock', locale) }), _jsx("th", { className: "px-2 py-1.5 font-medium", children: t('engine.edit.auditColNote', locale) })] }) }), _jsx("tbody", { children: events.map((ev) => (_jsxs("tr", { className: "border-t border-border/50 align-top hover:bg-muted/20", children: [_jsx("td", { className: "whitespace-nowrap px-2 py-1.5 font-mono text-[11px]", children: fmtTime(ev.occurredAt) }), _jsx("td", { className: "px-2 py-1.5", children: ev.actor }), _jsx("td", { className: "px-2 py-1.5", children: _jsx(Badge, { variant: "outline", className: "text-[10px]", children: ev.operation }) }), _jsx("td", { className: "px-2 py-1.5", children: outcomeBadge(ev.outcome) }), _jsx("td", { className: "px-2 py-1.5", children: ev.lockState && ev.lockState !== 'none' ? (_jsxs("span", { className: "font-mono text-[11px]", children: [ev.lockState, ev.lockOverridden ? ' *' : ''] })) : (_jsx("span", { className: "text-muted-foreground", children: "\u2014" })) }), _jsx("td", { className: "max-w-[28ch] truncate px-2 py-1.5 text-muted-foreground", title: ev.note ?? ev.code, children: ev.note ?? ev.code })] }, String(ev.id)))) })] })) })] }));
79
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MetadataDiagnosticsPage — governance overview.
3
+ *
4
+ * Renders the cross-type `/meta/diagnostics` sweep: every metadata
5
+ * item that fails load-time Zod validation, grouped by type, with a
6
+ * deep-link to its edit page. The framework computes this server-side
7
+ * (see `protocol.getMetaDiagnostics`); the client just paints it.
8
+ *
9
+ * Counterpart surfaces:
10
+ * • DirectoryPage tile badges — per-type aggregate
11
+ * • ResourceListPage row badges — per-item flag inside one type
12
+ * • ResourceEditPage banner + inline SchemaForm errors — full
13
+ * drill-down for a single item
14
+ *
15
+ * This page is the only one that shows everything in one view, so
16
+ * ops can answer "what's broken across the whole app?" without
17
+ * clicking into 27 type pages.
18
+ */
19
+ import * as React from 'react';
20
+ export declare function MetadataDiagnosticsPage(): React.JSX.Element;
@@ -0,0 +1,69 @@
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
+ * MetadataDiagnosticsPage — governance overview.
5
+ *
6
+ * Renders the cross-type `/meta/diagnostics` sweep: every metadata
7
+ * item that fails load-time Zod validation, grouped by type, with a
8
+ * deep-link to its edit page. The framework computes this server-side
9
+ * (see `protocol.getMetaDiagnostics`); the client just paints it.
10
+ *
11
+ * Counterpart surfaces:
12
+ * • DirectoryPage tile badges — per-type aggregate
13
+ * • ResourceListPage row badges — per-item flag inside one type
14
+ * • ResourceEditPage banner + inline SchemaForm errors — full
15
+ * drill-down for a single item
16
+ *
17
+ * This page is the only one that shows everything in one view, so
18
+ * ops can answer "what's broken across the whole app?" without
19
+ * clicking into 27 type pages.
20
+ */
21
+ import * as React from 'react';
22
+ import { Link } from 'react-router-dom';
23
+ import { AlertTriangle, RefreshCw, ArrowLeft } from 'lucide-react';
24
+ import { Button } from '@object-ui/components';
25
+ import { Badge } from '@object-ui/components';
26
+ import { Empty, EmptyTitle, EmptyDescription } from '@object-ui/components';
27
+ import { useMetadataClient, useMetadataTypes, useGlobalDiagnostics, } from './useMetadata';
28
+ import { t, tFormat, translateMetadataType, detectLocale } from './i18n';
29
+ export function MetadataDiagnosticsPage() {
30
+ const client = useMetadataClient();
31
+ const locale = React.useMemo(() => detectLocale(), []);
32
+ const [severity, setSeverity] = React.useState('error');
33
+ const { loading, error, summary, reload } = useGlobalDiagnostics(client, severity);
34
+ const { entries: typesEntries } = useMetadataTypes(client);
35
+ // Index by type so we can look up the human label per-type without
36
+ // scanning the typesEntries array each row.
37
+ const typeLabel = React.useMemo(() => {
38
+ const m = {};
39
+ for (const e of typesEntries) {
40
+ m[e.type] = translateMetadataType(e.type, locale, e.label);
41
+ }
42
+ return m;
43
+ }, [typesEntries, locale]);
44
+ // Group entries by type, ordered by descending count.
45
+ const groups = React.useMemo(() => {
46
+ var _a;
47
+ const map = {};
48
+ for (const e of summary.entries)
49
+ (map[_a = e.type] ?? (map[_a] = [])).push(e);
50
+ return Object.entries(map).sort(([, a], [, b]) => b.length - a.length);
51
+ }, [summary]);
52
+ return (_jsxs("div", { className: "flex flex-col h-full overflow-hidden", children: [_jsxs("div", { className: "px-6 pt-5 pb-4 border-b bg-background", children: [_jsx("nav", { className: "text-xs text-muted-foreground mb-2", children: _jsxs(Link, { to: "..", className: "hover:text-foreground inline-flex items-center gap-1", children: [_jsx(ArrowLeft, { className: "h-3 w-3" }), t('engine.diagnostics.back', locale)] }) }), _jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [_jsxs("h1", { className: "text-xl font-semibold flex items-center gap-2", children: [_jsx(AlertTriangle, { className: "h-5 w-5 text-destructive" }), t('engine.diagnostics.title', locale)] }), _jsx(Badge, { variant: "outline", className: "text-[11px] border-destructive/40 text-destructive bg-destructive/[0.06]", children: tFormat('engine.diagnostics.summary', locale, {
53
+ count: summary.total,
54
+ items: summary.scannedItems,
55
+ types: summary.scannedTypes,
56
+ }) }), _jsx("div", { className: "flex-1" }), _jsx("div", { role: "tablist", className: "inline-flex items-center rounded-md border bg-muted/40 p-0.5 text-xs", children: ['error', 'warning'].map((s) => (_jsx("button", { role: "tab", type: "button", "aria-selected": severity === s, onClick: () => setSeverity(s), className: 'px-2.5 py-1 rounded transition-colors ' +
57
+ (severity === s
58
+ ? 'bg-background shadow-sm text-foreground'
59
+ : 'text-muted-foreground hover:text-foreground'), children: t(`engine.diagnostics.severity.${s}`, locale) }, s))) }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: reload, children: [_jsx(RefreshCw, { className: "h-3.5 w-3.5 mr-1" }), t('engine.diagnostics.refresh', locale)] })] }), _jsx("p", { className: "text-sm text-muted-foreground mt-2 max-w-3xl", children: t('engine.diagnostics.description', locale) })] }), _jsxs("div", { className: "flex-1 overflow-auto p-6 space-y-6", children: [loading && (_jsx("div", { className: "text-sm text-muted-foreground", children: t('engine.diagnostics.loading', locale) })), !loading && error && (_jsx("div", { className: "text-sm text-destructive border border-destructive/30 rounded p-3 bg-destructive/[0.06]", children: tFormat('engine.diagnostics.loadFailed', locale, { error }) })), !loading && !error && groups.length === 0 && (_jsxs(Empty, { children: [_jsx(EmptyTitle, { children: t('engine.diagnostics.cleanTitle', locale) }), _jsx(EmptyDescription, { children: tFormat('engine.diagnostics.cleanHint', locale, {
60
+ items: summary.scannedItems,
61
+ types: summary.scannedTypes,
62
+ }) })] })), groups.map(([type, rows]) => (_jsxs("section", { className: "space-y-2", children: [_jsxs("h2", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground flex items-center gap-2", children: [_jsx(Link, { to: `../${encodeURIComponent(type)}`, className: "hover:text-foreground hover:underline", children: typeLabel[type] ?? type }), _jsx("span", { className: "font-mono normal-case tracking-normal text-[10px] opacity-70", children: type }), _jsx(Badge, { variant: "outline", className: "text-[10px] border-destructive/40 text-destructive bg-destructive/[0.06]", children: rows.length })] }), _jsx("div", { className: "border rounded-lg overflow-hidden", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/40 text-xs uppercase tracking-wider text-muted-foreground", children: _jsxs("tr", { children: [_jsx("th", { className: "px-3 py-2 text-left font-medium w-[28%]", children: t('engine.diagnostics.col.name', locale) }), _jsx("th", { className: "px-3 py-2 text-left font-medium", children: t('engine.diagnostics.col.issues', locale) })] }) }), _jsx("tbody", { className: "divide-y", children: rows.map((row) => {
63
+ const errs = row.diagnostics.errors ?? [];
64
+ const warns = row.diagnostics.warnings ?? [];
65
+ const head = (severity === 'warning' && errs.length === 0 ? warns : errs).slice(0, 3);
66
+ const rest = Math.max(0, (errs.length || warns.length) - head.length);
67
+ return (_jsxs("tr", { className: "hover:bg-accent/50 align-top", children: [_jsxs("td", { className: "px-3 py-2 align-top", children: [_jsx(Link, { to: `../${encodeURIComponent(type)}/${encodeURIComponent(row.name)}`, className: "text-primary hover:underline font-mono", children: row.name }), errs.length > 0 && (_jsx(Badge, { variant: "outline", className: "ml-2 text-[10px] border-destructive/40 text-destructive", children: tFormat('engine.diagnostics.errorN', locale, { count: errs.length }) })), warns.length > 0 && (_jsx(Badge, { variant: "outline", className: "ml-2 text-[10px] border-amber-500/40 text-amber-700 dark:text-amber-300", children: tFormat('engine.diagnostics.warnN', locale, { count: warns.length }) }))] }), _jsx("td", { className: "px-3 py-2 align-top", children: _jsxs("ul", { className: "space-y-0.5 font-mono text-[11px]", children: [head.map((d, i) => (_jsxs("li", { className: "truncate", children: [_jsx("span", { className: "text-muted-foreground", children: d.path || '(root)' }), _jsx("span", { className: "text-muted-foreground", children: ": " }), d.message] }, i))), rest > 0 && (_jsx("li", { className: "text-muted-foreground", children: tFormat('engine.diagnostics.more', locale, { count: rest }) }))] }) })] }, row.name));
68
+ }) })] }) })] }, type)))] })] }));
69
+ }
@@ -1 +1,16 @@
1
- export declare function MetadataDirectoryPage(): import("react/jsx-runtime").JSX.Element;
1
+ /**
2
+ * MetadataDirectoryPage — registry-driven landing page (Phase 3c).
3
+ *
4
+ * Replaces the Phase 3b placeholder. Improvements:
5
+ * • Search across type id + label + description.
6
+ * • Domain filter chips with counts.
7
+ * • "Writable only" toggle for admins triaging permissions work.
8
+ * • Tiles show: label, machine name, item count (lazy fetched per
9
+ * type when in view), badges (writable / overlay), description.
10
+ *
11
+ * Item counts are lazy — we only fetch when the user lands on a
12
+ * domain that has it. For MVP we just show "—" until the user clicks
13
+ * into a type. Pre-fetching all 27 counts on page load is wasteful.
14
+ */
15
+ import * as React from 'react';
16
+ export declare function MetadataDirectoryPage(): React.JSX.Element;