@object-ui/app-shell 6.2.2 → 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 +967 -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,122 @@
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
+ * ToolPreview — read-only summary of an AI Tool metadata draft.
5
+ *
6
+ * AI tools are LLM-callable functions whose contract is a JSON Schema
7
+ * in `parameters`. The preview renders:
8
+ *
9
+ * 1. A header strip: machine name, category, target object, flags
10
+ * (active, requiresConfirmation, builtIn).
11
+ * 2. The description verbatim (this is what the LLM reads to decide
12
+ * when to call the tool, so authors must be able to skim it).
13
+ * 3. An **input parameters** table extracted from the JSON Schema:
14
+ * one row per top-level property with type, required marker,
15
+ * description, enum hints, and default value.
16
+ * 4. An **output schema** mirror table when `outputSchema` is set.
17
+ * 5. A skeletal "example invocation" panel showing what the LLM
18
+ * would emit if it called the tool with required fields stubbed.
19
+ *
20
+ * We do not run the tool from the preview — invocation requires auth,
21
+ * permission checks, and live datasource access that the preview
22
+ * sandbox doesn't provide. Authors get an `Open in API Console` link
23
+ * for end-to-end testing.
24
+ */
25
+ import * as React from 'react';
26
+ import { AlertTriangle, Box, CheckCircle2, ChevronRight, Database, ExternalLink, FileJson, Power, Tag, Wrench, } from 'lucide-react';
27
+ import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
28
+ function isObjectSchema(s) {
29
+ return !!s && typeof s === 'object' && typeof s.properties === 'object';
30
+ }
31
+ function typeLabel(p) {
32
+ if (!p)
33
+ return 'any';
34
+ if (Array.isArray(p.type))
35
+ return p.type.join('|');
36
+ if (p.type === 'array' && p.items)
37
+ return `${typeLabel(p.items)}[]`;
38
+ if (p.$ref)
39
+ return p.$ref.split('/').pop() || 'ref';
40
+ return p.type ?? 'any';
41
+ }
42
+ function stubValue(p) {
43
+ if (p.default !== undefined)
44
+ return p.default;
45
+ if (Array.isArray(p.enum) && p.enum.length)
46
+ return p.enum[0];
47
+ const t = Array.isArray(p.type) ? p.type[0] : p.type;
48
+ switch (t) {
49
+ case 'string':
50
+ return p.format ? `<${p.format}>` : '<string>';
51
+ case 'number':
52
+ case 'integer':
53
+ return 0;
54
+ case 'boolean':
55
+ return false;
56
+ case 'array':
57
+ return [];
58
+ case 'object':
59
+ return {};
60
+ default:
61
+ return null;
62
+ }
63
+ }
64
+ export function ToolPreview({ name, draft }) {
65
+ const d = draft;
66
+ const toolName = String(d.name ?? name ?? '');
67
+ const label = String(d.label ?? toolName);
68
+ const description = String(d.description ?? '');
69
+ const category = d.category || undefined;
70
+ const objectName = d.objectName || undefined;
71
+ const requiresConfirmation = !!d.requiresConfirmation;
72
+ const active = d.active !== false;
73
+ const builtIn = !!d.builtIn;
74
+ const parameters = (d.parameters ?? {});
75
+ const outputSchema = (d.outputSchema ?? undefined);
76
+ const props = isObjectSchema(parameters) ? parameters.properties ?? {} : {};
77
+ const required = new Set(Array.isArray(parameters.required) ? parameters.required : []);
78
+ const exampleArgs = React.useMemo(() => {
79
+ const out = {};
80
+ for (const key of required) {
81
+ if (props[key])
82
+ out[key] = stubValue(props[key]);
83
+ }
84
+ // If there are no required fields, show the first optional one to
85
+ // give the LLM a reasonable example shape.
86
+ if (Object.keys(out).length === 0) {
87
+ const firstKey = Object.keys(props)[0];
88
+ if (firstKey)
89
+ out[firstKey] = stubValue(props[firstKey]);
90
+ }
91
+ return out;
92
+ }, [props, required]);
93
+ if (!toolName && !description && Object.keys(props).length === 0) {
94
+ return (_jsx(PreviewShell, { hint: "tool", children: _jsx(PreviewMessage, { children: "Set name, description, and parameters to see the tool preview." }) }));
95
+ }
96
+ return (_jsx(PreviewShell, { hint: "tool", toolbar: toolName && (_jsxs("a", { href: `/developer/api-console?path=/api/v1/ai/tools/${encodeURIComponent(toolName)}/invoke`, target: "_blank", rel: "noreferrer", className: "text-xs inline-flex items-center gap-1 text-muted-foreground hover:text-foreground", title: "Open API Console to test invocation", children: ["Open in API Console ", _jsx(ExternalLink, { className: "h-3 w-3" })] })), children: _jsx(PreviewErrorBoundary, { children: _jsxs("div", { className: "p-3 space-y-3", children: [_jsxs("div", { className: "rounded border bg-muted/30 p-3 space-y-1", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Wrench, { className: "h-4 w-4 mt-0.5 text-muted-foreground shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("span", { className: "text-sm font-medium truncate", children: label }), _jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: toolName })] }), _jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px]", children: [category && _jsx(Pill, { icon: Tag, label: category }), objectName && _jsx(Pill, { icon: Database, label: objectName, mono: true }), _jsx(Pill, { icon: Power, label: active ? 'Active' : 'Disabled', tone: active ? 'green' : 'gray' }), requiresConfirmation && (_jsx(Pill, { icon: AlertTriangle, label: "Requires confirmation", tone: "amber" })), builtIn && _jsx(Pill, { label: "built-in" })] })] })] }), description && (_jsx("div", { className: "pl-6 text-xs text-foreground whitespace-pre-wrap", children: description }))] }), _jsx(Section, { title: "Input Parameters", count: Object.keys(props).length, children: Object.keys(props).length === 0 ? (_jsx(Empty, { children: "This tool takes no input parameters." })) : (_jsx(ParamTable, { props: props, required: required })) }), Object.keys(props).length > 0 && (_jsx(Section, { title: "Example LLM Call", icon: FileJson, children: _jsx("pre", { className: "m-0 rounded border bg-background p-2.5 text-xs font-mono overflow-auto max-h-[200px]", children: `{
97
+ "tool": "${toolName}",
98
+ "arguments": ${JSON.stringify(exampleArgs, null, 2).replace(/\n/g, '\n ')}
99
+ }` }) })), isObjectSchema(outputSchema) && outputSchema.properties && Object.keys(outputSchema.properties).length > 0 && (_jsx(Section, { title: "Output Schema", count: Object.keys(outputSchema.properties).length, icon: Box, children: _jsx(ParamTable, { props: outputSchema.properties, required: new Set(Array.isArray(outputSchema.required) ? outputSchema.required : []) }) }))] }) }) }));
100
+ }
101
+ function ParamTable({ props, required }) {
102
+ const keys = Object.keys(props);
103
+ return (_jsx("div", { className: "rounded border bg-background overflow-hidden", children: _jsxs("table", { className: "w-full text-xs", children: [_jsx("thead", { children: _jsxs("tr", { className: "bg-muted/30 text-left text-[10px] uppercase tracking-wider text-muted-foreground", children: [_jsx("th", { className: "px-2.5 py-1.5 font-medium", children: "Name" }), _jsx("th", { className: "px-2.5 py-1.5 font-medium", children: "Type" }), _jsx("th", { className: "px-2.5 py-1.5 font-medium", children: "Description" })] }) }), _jsx("tbody", { className: "divide-y", children: keys.map((k) => {
104
+ const p = props[k];
105
+ const isReq = required.has(k);
106
+ return (_jsxs("tr", { className: "align-top", children: [_jsx("td", { className: "px-2.5 py-1.5 font-mono", children: _jsxs("div", { className: "flex items-center gap-1", children: [isReq ? (_jsx(CheckCircle2, { className: "h-3 w-3 text-emerald-600" })) : (_jsx(ChevronRight, { className: "h-3 w-3 text-muted-foreground" })), k, isReq && _jsx("span", { className: "text-[9px] uppercase text-emerald-700 ml-1", children: "req" })] }) }), _jsx("td", { className: "px-2.5 py-1.5 font-mono text-muted-foreground", children: typeLabel(p) }), _jsxs("td", { className: "px-2.5 py-1.5", children: [p.description && _jsx("div", { children: p.description }), Array.isArray(p.enum) && p.enum.length > 0 && (_jsxs("div", { className: "text-[10px] text-muted-foreground", children: ["enum: ", p.enum.map((v) => JSON.stringify(v)).join(' | ')] })), p.default !== undefined && (_jsxs("div", { className: "text-[10px] text-muted-foreground", children: ["default: ", _jsx("code", { className: "font-mono", children: JSON.stringify(p.default) })] })), p.format && (_jsxs("div", { className: "text-[10px] text-muted-foreground", children: ["format: ", p.format] }))] })] }, k));
107
+ }) })] }) }));
108
+ }
109
+ function Section({ title, count, icon: Icon, children, }) {
110
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground uppercase tracking-wider", children: [Icon && _jsx(Icon, { className: "h-3 w-3" }), _jsx("span", { children: title }), count != null && _jsxs("span", { className: "opacity-70", children: ["(", count, ")"] })] }), children] }));
111
+ }
112
+ function Empty({ children }) {
113
+ return _jsx("div", { className: "text-xs text-muted-foreground italic", children: children });
114
+ }
115
+ function Pill({ icon: Icon, label, tone = 'gray', mono = false, }) {
116
+ const cls = tone === 'green'
117
+ ? 'text-emerald-700'
118
+ : tone === 'amber'
119
+ ? 'text-amber-700'
120
+ : 'text-foreground';
121
+ return (_jsxs("span", { className: "inline-flex items-center gap-1", children: [Icon && _jsx(Icon, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { className: `${cls} ${mono ? 'font-mono' : ''}`, children: label })] }));
122
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * TranslationPreview — read-only coverage report for one locale bundle.
3
+ *
4
+ * A translation record represents exactly one locale (per the i18n ADR).
5
+ * This preview answers two questions an operator typically has when
6
+ * opening a translation:
7
+ *
8
+ * 1. "Which locale is this and how complete is it?" → header strip
9
+ * with the locale badge, total-key count, and an overall coverage
10
+ * bar (categories that have at least one entry).
11
+ * 2. "Where are the strings?" → a card per category in
12
+ * `TranslationDataSchema`: objects · apps · messages ·
13
+ * validationMessages · globalActions · dashboards · settings ·
14
+ * metadataForms. Each card shows the count of top-level keys and
15
+ * a sample of up to 5 keys so the user can confirm the right
16
+ * bundle is loaded.
17
+ *
18
+ * For flat string maps (messages, validationMessages, globalActions,
19
+ * settings) we render a small key→value sample table. For nested
20
+ * objects (objects, apps, dashboards, metadataForms) we list the
21
+ * top-level keys with their inner key count.
22
+ */
23
+ import * as React from 'react';
24
+ import type { MetadataPreviewProps } from '../preview-registry';
25
+ export declare function TranslationPreview({ name, draft }: MetadataPreviewProps): React.JSX.Element;
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AppWindow, ClipboardList, FileText, Gauge, Globe2, LayoutDashboard, Languages, ListChecks, MessageCircle, Settings2, ShieldAlert, } from 'lucide-react';
3
+ import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
4
+ const CATEGORIES = [
5
+ { key: 'objects', label: 'Objects', icon: ListChecks, flat: false },
6
+ { key: 'apps', label: 'Apps', icon: AppWindow, flat: false },
7
+ { key: 'messages', label: 'Messages', icon: MessageCircle, flat: true },
8
+ { key: 'validationMessages', label: 'Validation Messages', icon: ShieldAlert, flat: true },
9
+ { key: 'globalActions', label: 'Global Actions', icon: ClipboardList, flat: true },
10
+ { key: 'dashboards', label: 'Dashboards', icon: LayoutDashboard, flat: false },
11
+ { key: 'settings', label: 'Settings', icon: Settings2, flat: true },
12
+ { key: 'metadataForms', label: 'Metadata Forms', icon: FileText, flat: false },
13
+ ];
14
+ export function TranslationPreview({ name, draft }) {
15
+ const d = draft;
16
+ const locale = d.locale ?? d.language ?? '?';
17
+ const label = d.label ?? d.name ?? name ?? '';
18
+ const description = d.description;
19
+ const data = d.data ?? d;
20
+ const counts = CATEGORIES.map((cat) => {
21
+ const bag = data?.[cat.key];
22
+ if (!bag || typeof bag !== 'object')
23
+ return { ...cat, count: 0, sample: [] };
24
+ const entries = Object.entries(bag);
25
+ return { ...cat, count: entries.length, sample: entries.slice(0, 5) };
26
+ });
27
+ const totalKeys = counts.reduce((sum, c) => sum + c.count, 0);
28
+ const populated = counts.filter((c) => c.count > 0).length;
29
+ const coverage = Math.round((populated / CATEGORIES.length) * 100);
30
+ if (totalKeys === 0) {
31
+ return (_jsx(PreviewShell, { hint: `translation · ${locale}`, children: _jsx(PreviewMessage, { children: "This bundle is empty \u2014 add at least one translated string to see the coverage report." }) }));
32
+ }
33
+ return (_jsx(PreviewShell, { hint: `translation · ${locale} · ${totalKeys} keys`, children: _jsx(PreviewErrorBoundary, { children: _jsxs("div", { className: "p-3 space-y-3", children: [_jsx("div", { className: "rounded border bg-muted/30 p-3", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Languages, { className: "h-4 w-4 mt-0.5 text-muted-foreground shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("span", { className: "text-sm font-medium truncate", children: label }), _jsxs("span", { className: "inline-flex items-center gap-1 rounded bg-emerald-50 border border-emerald-200 px-1.5 py-0.5 text-[10px] font-mono text-emerald-800", children: [_jsx(Globe2, { className: "h-3 w-3" }), " ", locale] })] }), description && _jsx("div", { className: "text-xs text-muted-foreground mt-0.5", children: description }), _jsxs("div", { className: "mt-2 flex items-center gap-2 text-[11px]", children: [_jsx(Gauge, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { className: "text-muted-foreground", children: "Category coverage:" }), _jsx("div", { className: "h-1.5 w-32 rounded-full bg-muted overflow-hidden", children: _jsx("div", { className: "h-full bg-emerald-500", style: { width: `${coverage}%` } }) }), _jsxs("span", { className: "font-mono", children: [populated, "/", CATEGORIES.length, " (", coverage, "%)"] }), _jsxs("span", { className: "ml-3 text-muted-foreground", children: [totalKeys, " total keys"] })] })] })] }) }), _jsx("div", { className: "grid gap-2 sm:grid-cols-2", children: counts.map((c) => (_jsx(CategoryCard, { cat: c }, c.key))) })] }) }) }));
34
+ }
35
+ function CategoryCard({ cat, }) {
36
+ const Icon = cat.icon;
37
+ return (_jsxs("div", { className: `rounded border bg-background ${cat.count === 0 ? 'opacity-60' : ''}`, children: [_jsxs("div", { className: "flex items-center justify-between border-b px-2.5 py-1.5", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(Icon, { className: "h-3.5 w-3.5 text-muted-foreground" }), _jsx("span", { className: "text-xs font-medium", children: cat.label })] }), _jsx("span", { className: "rounded bg-muted px-1.5 py-0.5 text-[10px] font-mono", children: cat.count })] }), _jsx("div", { className: "px-2.5 py-1.5 min-h-[3.5rem]", children: cat.count === 0 ? (_jsx("div", { className: "text-[11px] text-muted-foreground italic", children: "empty" })) : (_jsxs("ul", { className: "space-y-0.5 text-[11px]", children: [cat.sample.map(([k, v]) => (_jsxs("li", { className: "flex items-baseline gap-2 truncate", children: [_jsx("code", { className: "font-mono text-muted-foreground shrink-0", children: k }), _jsx("span", { className: "truncate text-foreground/80", children: renderSampleValue(v, cat.flat) })] }, k))), cat.count > cat.sample.length && (_jsxs("li", { className: "text-[10px] text-muted-foreground italic", children: ["+", cat.count - cat.sample.length, " more\u2026"] }))] })) })] }));
38
+ }
39
+ function renderSampleValue(v, flat) {
40
+ if (flat) {
41
+ if (typeof v === 'string')
42
+ return `"${v}"`;
43
+ if (v == null)
44
+ return '∅';
45
+ return String(v);
46
+ }
47
+ if (v && typeof v === 'object') {
48
+ const n = Object.keys(v).length;
49
+ return `{${n} keys}`;
50
+ }
51
+ return String(v ?? '∅');
52
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ValidationPreview — read-only summary of a Validation rule draft.
3
+ *
4
+ * Validation is a discriminated union by `type`:
5
+ * script · unique · state_machine · format · cross_field · async ·
6
+ * custom · conditional · plus the schema-style JSONValidationSchema.
7
+ *
8
+ * The preview shows a shared envelope (target, message, severity,
9
+ * active, events, priority, tags) and then a type-specific body so
10
+ * each rule shape gets the right vocabulary instead of a generic
11
+ * "field dump":
12
+ *
13
+ * • script → CEL condition block
14
+ * • unique → unique fields + scope (CEL)
15
+ * • state_machine → from→to transitions matrix
16
+ * • format → regex / built-in format name
17
+ * • cross_field → involved fields + cross-field condition
18
+ * • async → endpoint URL + timeout
19
+ * • custom → handler reference
20
+ * • conditional → predicate + nested rule reference
21
+ *
22
+ * Severity drives the accent color (error=red, warning=amber,
23
+ * info=blue) the same way runtime UI surfaces it.
24
+ */
25
+ import * as React from 'react';
26
+ import type { MetadataPreviewProps } from '../preview-registry';
27
+ export declare function ValidationPreview({ name, draft }: MetadataPreviewProps): React.JSX.Element;
@@ -0,0 +1,110 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { AlertTriangle, ArrowRight, Code2, Fingerprint, Globe2, Info, Power, Regex, ShieldAlert, Sigma, Workflow, XOctagon, } from 'lucide-react';
3
+ import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
4
+ function celText(c) {
5
+ if (!c)
6
+ return undefined;
7
+ if (typeof c === 'string')
8
+ return c;
9
+ if (typeof c === 'object' && typeof c.source === 'string')
10
+ return c.source;
11
+ return undefined;
12
+ }
13
+ function severityTone(s) {
14
+ switch (s) {
15
+ case 'error':
16
+ return {
17
+ ring: 'border-red-200 bg-red-50 dark:border-red-900 dark:bg-red-950/40',
18
+ text: 'text-red-700 dark:text-red-300',
19
+ icon: XOctagon,
20
+ };
21
+ case 'warning':
22
+ return {
23
+ ring: 'border-amber-200 bg-amber-50 dark:border-amber-900 dark:bg-amber-950/40',
24
+ text: 'text-amber-800 dark:text-amber-300',
25
+ icon: AlertTriangle,
26
+ };
27
+ case 'info':
28
+ default:
29
+ return {
30
+ ring: 'border-blue-200 bg-blue-50 dark:border-blue-900 dark:bg-blue-950/40',
31
+ text: 'text-blue-800 dark:text-blue-300',
32
+ icon: Info,
33
+ };
34
+ }
35
+ }
36
+ export function ValidationPreview({ name, draft }) {
37
+ const d = draft;
38
+ const ruleName = String(d.name ?? name ?? '');
39
+ const label = String(d.label ?? ruleName);
40
+ const description = d.description ?? '';
41
+ const type = d.type ?? 'script';
42
+ const object = d.object;
43
+ const message = d.message ?? '';
44
+ const severity = (d.severity ?? 'error');
45
+ const active = d.active !== false;
46
+ const events = Array.isArray(d.events) ? d.events : [];
47
+ const priority = d.priority;
48
+ const tags = Array.isArray(d.tags) ? d.tags : [];
49
+ const tone = severityTone(severity);
50
+ if (!ruleName) {
51
+ return (_jsx(PreviewShell, { hint: "validation", children: _jsx(PreviewMessage, { children: "Give the validation a name to see the preview." }) }));
52
+ }
53
+ return (_jsx(PreviewShell, { hint: `validation · ${type}`, children: _jsx(PreviewErrorBoundary, { children: _jsxs("div", { className: "p-3 space-y-3", children: [_jsx("div", { className: "rounded border bg-muted/30 p-3", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(ShieldAlert, { className: "h-4 w-4 mt-0.5 text-muted-foreground shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("span", { className: "text-sm font-medium truncate", children: label }), _jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: ruleName }), _jsx("span", { className: "rounded border bg-background px-1.5 py-0.5 text-[10px] font-mono", children: type })] }), description && (_jsx("div", { className: "text-xs text-muted-foreground mt-0.5", children: description })), _jsxs("div", { className: "mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px]", children: [_jsx(Pill, { icon: Power, label: active ? 'Active' : 'Disabled', tone: active ? 'green' : 'gray' }), object && _jsx(Pill, { label: `object: ${object}`, mono: true }), priority != null && _jsx(Pill, { label: `priority ${priority}` }), events.length > 0 && (_jsx(Pill, { label: `on ${events.join(', ')}` }))] })] })] }) }), _jsx("div", { className: `rounded border p-2.5 text-xs ${tone.ring}`, children: _jsxs("div", { className: `flex items-start gap-1.5 ${tone.text}`, children: [_jsx(tone.icon, { className: "h-3.5 w-3.5 mt-0.5 shrink-0" }), _jsxs("div", { children: [_jsx("div", { className: "font-medium uppercase tracking-wider text-[10px]", children: severity }), _jsx("div", { className: "font-normal mt-0.5 text-foreground", children: message || _jsx("span", { className: "italic text-muted-foreground", children: "no message set" }) })] })] }) }), _jsx(TypeBody, { type: type, d: d }), tags.length > 0 && (_jsxs("div", { children: [_jsx("div", { className: "text-[11px] font-medium text-muted-foreground uppercase tracking-wider mb-1", children: "Tags" }), _jsx("div", { className: "flex flex-wrap gap-1", children: tags.map((t) => (_jsx("span", { className: "inline-flex items-center rounded border bg-muted/40 px-1.5 py-0.5 text-[11px] font-mono", children: t }, t))) })] }))] }) }) }));
54
+ }
55
+ function TypeBody({ type, d }) {
56
+ switch (type) {
57
+ case 'script':
58
+ case 'conditional':
59
+ return (_jsx(Section, { title: "Condition", icon: Code2, children: _jsx(CelBlock, { value: celText(d.condition) ?? celText(d.expression) }) }));
60
+ case 'unique': {
61
+ const fields = Array.isArray(d.fields) ? d.fields : [];
62
+ const scope = celText(d.scope) ?? celText(d.where);
63
+ return (_jsxs(_Fragment, { children: [_jsx(Section, { title: `Unique on ${fields.length} field${fields.length === 1 ? '' : 's'}`, icon: Fingerprint, children: _jsx("div", { className: "flex flex-wrap gap-1", children: fields.length === 0 ? (_jsx("span", { className: "text-xs text-amber-700 dark:text-amber-400", children: "no fields set" })) : (fields.map((f) => (_jsx("span", { className: "rounded border bg-muted/40 px-1.5 py-0.5 text-[11px] font-mono", children: f }, f)))) }) }), scope && (_jsx(Section, { title: "Scope", icon: Sigma, children: _jsx(CelBlock, { value: scope }) }))] }));
64
+ }
65
+ case 'state_machine': {
66
+ // ADR-0020 shape: transitions is a `{ fromState: [allowedToStates] }` map.
67
+ const transitionMap = d.transitions && typeof d.transitions === 'object' && !Array.isArray(d.transitions)
68
+ ? d.transitions
69
+ : {};
70
+ const entries = Object.entries(transitionMap);
71
+ const field = d.field;
72
+ return (_jsx(Section, { title: `Transitions${field ? ` on ${field}` : ''}`, icon: Workflow, children: entries.length === 0 ? (_jsx("div", { className: "text-xs text-amber-700 dark:text-amber-400", children: "No transitions declared." })) : (_jsx("ul", { className: "rounded border bg-background divide-y text-xs", children: entries.map(([from, tos]) => (_jsxs("li", { className: "flex items-center gap-2 px-2.5 py-1.5", children: [_jsx("span", { className: "font-mono", children: from }), _jsx(ArrowRight, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { className: "font-mono text-emerald-700 dark:text-emerald-400", children: Array.isArray(tos) && tos.length > 0 ? tos.join(' | ') : '∅ (dead-end)' })] }, from))) })) }));
73
+ }
74
+ case 'format': {
75
+ const pattern = d.pattern ?? d.regex;
76
+ const format = d.format;
77
+ return (_jsx(Section, { title: "Format", icon: Regex, children: _jsxs("div", { className: "rounded border bg-background p-2.5 text-xs space-y-1", children: [format && (_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Built-in:" }), ' ', _jsx("code", { className: "font-mono", children: format })] })), pattern && (_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Pattern:" }), ' ', _jsx("code", { className: "font-mono break-all", children: pattern })] })), !format && !pattern && _jsx("span", { className: "text-amber-700 dark:text-amber-400", children: "No format or regex set." })] }) }));
78
+ }
79
+ case 'cross_field': {
80
+ const fields = Array.isArray(d.fields) ? d.fields : [];
81
+ const condition = celText(d.condition);
82
+ return (_jsxs(_Fragment, { children: [_jsx(Section, { title: "Fields involved", icon: Sigma, children: _jsxs("div", { className: "flex flex-wrap gap-1", children: [fields.map((f) => (_jsx("span", { className: "rounded border bg-muted/40 px-1.5 py-0.5 text-[11px] font-mono", children: f }, f))), fields.length === 0 && _jsx("span", { className: "text-xs text-muted-foreground italic", children: "none" })] }) }), _jsx(Section, { title: "Cross-field condition", icon: Code2, children: _jsx(CelBlock, { value: condition }) })] }));
83
+ }
84
+ case 'async': {
85
+ const endpoint = d.endpoint ?? d.url;
86
+ const timeout = d.timeoutMs;
87
+ const method = d.method ?? 'POST';
88
+ return (_jsx(Section, { title: "Async endpoint", icon: Globe2, children: _jsxs("div", { className: "rounded border bg-background p-2.5 text-xs space-y-1", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "rounded bg-muted px-1.5 py-0.5 text-[10px] font-mono", children: method }), _jsx("code", { className: "font-mono break-all", children: endpoint ?? '—' })] }), timeout != null && (_jsxs("div", { className: "text-muted-foreground", children: ["timeout: ", timeout, "ms"] }))] }) }));
89
+ }
90
+ case 'custom': {
91
+ const handler = d.handler ?? d.function;
92
+ return (_jsx(Section, { title: "Custom handler", icon: Code2, children: _jsx("div", { className: "rounded border bg-background px-2.5 py-1.5 text-xs", children: handler ? _jsx("code", { className: "font-mono break-all", children: handler }) : _jsx("span", { className: "text-amber-700 dark:text-amber-400", children: "No handler set." }) }) }));
93
+ }
94
+ default:
95
+ return (_jsx(Section, { title: "Rule", icon: ShieldAlert, children: _jsxs("div", { className: "rounded border bg-background p-2.5 text-xs text-muted-foreground italic", children: ["Unknown rule type \"", type, "\". Showing common fields only."] }) }));
96
+ }
97
+ }
98
+ function CelBlock({ value }) {
99
+ if (!value) {
100
+ return _jsx("div", { className: "text-xs text-amber-700 dark:text-amber-400", children: "No expression set." });
101
+ }
102
+ return (_jsx("pre", { className: "rounded border bg-background p-2.5 text-xs font-mono whitespace-pre-wrap break-words", children: value }));
103
+ }
104
+ function Section({ title, icon: Icon, children, }) {
105
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground uppercase tracking-wider", children: [Icon && _jsx(Icon, { className: "h-3 w-3" }), _jsx("span", { children: title })] }), children] }));
106
+ }
107
+ function Pill({ icon: Icon, label, tone = 'gray', mono = false, }) {
108
+ const cls = tone === 'green' ? 'text-emerald-700 dark:text-emerald-400' : 'text-foreground';
109
+ return (_jsxs("span", { className: "inline-flex items-center gap-1", children: [Icon && _jsx(Icon, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { className: `${cls} ${mono ? 'font-mono' : ''}`, children: label })] }));
110
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Compact controls for the View column bar.
3
+ *
4
+ * • ColumnChip — a single draggable column "pill": click to
5
+ * select (→ inspector), drag to reorder, × to remove. Designed to
6
+ * sit in a one-line toolbar above the live grid preview so the
7
+ * preview — not the field manager — owns the canvas.
8
+ *
9
+ * • AddFieldPopover — an Airtable/Notion-style "+ Add field" button
10
+ * that opens a searchable checklist of the bound Object's fields.
11
+ * Click a field to append it as a column. Already-used fields are
12
+ * tagged "Added" but stay clickable (a table may show a field
13
+ * twice). Removal is explicit via the chip × so column-level config
14
+ * (label, width, sortable…) is never silently dropped.
15
+ */
16
+ import * as React from 'react';
17
+ import type { ObjectFieldInfo } from './useObjectFields';
18
+ export declare function ColumnChip({ index, label, fieldType, selected, canEdit, dragging, dropBefore, onSelect, onRemove, onDragStart, onDragEnd, onDragOverChip, onDropChip, }: {
19
+ index: number;
20
+ label: string;
21
+ fieldType: unknown;
22
+ selected: boolean;
23
+ canEdit: boolean;
24
+ dragging: boolean;
25
+ dropBefore: boolean;
26
+ onSelect: () => void;
27
+ onRemove: () => void;
28
+ onDragStart: () => void;
29
+ onDragEnd: () => void;
30
+ onDragOverChip: () => void;
31
+ onDropChip: () => void;
32
+ }): React.JSX.Element;
33
+ /**
34
+ * FieldListRow — a full-width, vertically-stacked variant of {@link ColumnChip}
35
+ * for the right-panel Fields list. Same HTML5 drag-and-drop contract (click to
36
+ * select, drag the handle to reorder, × to remove) but laid out as a list row
37
+ * (icon · label · machine name · remove) so it reads like a mainstream
38
+ * low-code field manager rather than a horizontal toolbar.
39
+ */
40
+ export declare function FieldListRow({ index, label, fieldName, fieldType, selected, canEdit, dragging, dropBefore, onSelect, onRemove, onDragStart, onDragEnd, onDragOverRow, onDropRow, }: {
41
+ index: number;
42
+ label: string;
43
+ fieldName?: string;
44
+ fieldType: unknown;
45
+ selected: boolean;
46
+ canEdit: boolean;
47
+ dragging: boolean;
48
+ dropBefore: boolean;
49
+ onSelect: () => void;
50
+ onRemove: () => void;
51
+ onDragStart: () => void;
52
+ onDragEnd: () => void;
53
+ onDragOverRow: () => void;
54
+ onDropRow: () => void;
55
+ }): React.JSX.Element;
56
+ export declare function AddFieldPopover({ fields, usedNames, loading, error, onAdd, }: {
57
+ fields: ObjectFieldInfo[];
58
+ usedNames: Set<string>;
59
+ loading: boolean;
60
+ error: string | null;
61
+ onAdd: (field: ObjectFieldInfo) => void;
62
+ }): React.JSX.Element;
@@ -0,0 +1,140 @@
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
+ * Compact controls for the View column bar.
5
+ *
6
+ * • ColumnChip — a single draggable column "pill": click to
7
+ * select (→ inspector), drag to reorder, × to remove. Designed to
8
+ * sit in a one-line toolbar above the live grid preview so the
9
+ * preview — not the field manager — owns the canvas.
10
+ *
11
+ * • AddFieldPopover — an Airtable/Notion-style "+ Add field" button
12
+ * that opens a searchable checklist of the bound Object's fields.
13
+ * Click a field to append it as a column. Already-used fields are
14
+ * tagged "Added" but stay clickable (a table may show a field
15
+ * twice). Removal is explicit via the chip × so column-level config
16
+ * (label, width, sortable…) is never silently dropped.
17
+ */
18
+ import * as React from 'react';
19
+ import { GripVertical, Plus, Search, X } from 'lucide-react';
20
+ import { Badge, Popover, PopoverContent, PopoverTrigger, } from '@object-ui/components';
21
+ import { resolveFieldTypeMeta, resolveCategoryTone } from './field-types';
22
+ import { detectLocale, t, tFormat } from '../i18n';
23
+ const DND_MIME = 'text/x-objectui-viewcol';
24
+ function FieldIcon({ type }) {
25
+ const meta = resolveFieldTypeMeta(type);
26
+ const tone = resolveCategoryTone(type);
27
+ const Icon = meta.Icon;
28
+ return _jsx(Icon, { className: `h-3.5 w-3.5 shrink-0 ${tone.icon}` });
29
+ }
30
+ /* ───────────────────────────── Column chip ────────────────────────────── */
31
+ export function ColumnChip({ index, label, fieldType, selected, canEdit, dragging, dropBefore, onSelect, onRemove, onDragStart, onDragEnd, onDragOverChip, onDropChip, }) {
32
+ return (_jsxs("div", { className: "relative flex items-stretch", children: [dropBefore && (_jsx("span", { className: "pointer-events-none absolute -left-1 top-0 h-full w-0.5 rounded bg-primary" })), _jsxs("div", { role: "button", tabIndex: 0, draggable: canEdit, "aria-pressed": selected, onDragStart: (e) => {
33
+ if (!canEdit)
34
+ return;
35
+ e.dataTransfer.effectAllowed = 'move';
36
+ e.dataTransfer.setData(DND_MIME, String(index));
37
+ onDragStart();
38
+ }, onDragEnd: onDragEnd, onDragOver: (e) => {
39
+ if (!canEdit || !dragging)
40
+ return;
41
+ if (!e.dataTransfer.types.includes(DND_MIME))
42
+ return;
43
+ e.preventDefault();
44
+ e.dataTransfer.dropEffect = 'move';
45
+ onDragOverChip();
46
+ }, onDrop: (e) => {
47
+ if (!canEdit)
48
+ return;
49
+ if (!e.dataTransfer.types.includes(DND_MIME))
50
+ return;
51
+ e.preventDefault();
52
+ e.stopPropagation();
53
+ onDropChip();
54
+ }, onClick: onSelect, onKeyDown: (e) => {
55
+ if (e.key === 'Enter' || e.key === ' ') {
56
+ e.preventDefault();
57
+ onSelect();
58
+ }
59
+ }, className: 'group inline-flex items-center gap-1.5 rounded-md border bg-card py-1 pl-1.5 pr-1 text-xs transition-colors hover:border-primary/40 ' +
60
+ (selected ? 'border-primary ring-1 ring-primary' : 'border-border') +
61
+ (canEdit ? ' cursor-grab active:cursor-grabbing' : ''), children: [canEdit && (_jsx(GripVertical, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground/40 group-hover:text-muted-foreground" })), _jsx(FieldIcon, { type: fieldType }), _jsx("span", { className: "max-w-[12rem] truncate font-medium", children: label }), canEdit && (_jsx("span", { role: "button", tabIndex: 0, "aria-label": `Remove ${label}`, onClick: (e) => {
62
+ e.stopPropagation();
63
+ onRemove();
64
+ }, onKeyDown: (e) => {
65
+ if (e.key === 'Enter' || e.key === ' ') {
66
+ e.preventDefault();
67
+ e.stopPropagation();
68
+ onRemove();
69
+ }
70
+ }, className: "inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground/60 hover:bg-destructive/10 hover:text-destructive", children: _jsx(X, { className: "h-3 w-3" }) }))] })] }));
71
+ }
72
+ /* ───────────────────────── Field list row (vertical) ──────────────────── */
73
+ /**
74
+ * FieldListRow — a full-width, vertically-stacked variant of {@link ColumnChip}
75
+ * for the right-panel Fields list. Same HTML5 drag-and-drop contract (click to
76
+ * select, drag the handle to reorder, × to remove) but laid out as a list row
77
+ * (icon · label · machine name · remove) so it reads like a mainstream
78
+ * low-code field manager rather than a horizontal toolbar.
79
+ */
80
+ export function FieldListRow({ index, label, fieldName, fieldType, selected, canEdit, dragging, dropBefore, onSelect, onRemove, onDragStart, onDragEnd, onDragOverRow, onDropRow, }) {
81
+ return (_jsxs("div", { className: "relative", children: [dropBefore && (_jsx("span", { className: "pointer-events-none absolute -top-0.5 left-0 right-0 h-0.5 rounded bg-primary" })), _jsxs("div", { role: "button", tabIndex: 0, draggable: canEdit, "aria-pressed": selected, onDragStart: (e) => {
82
+ if (!canEdit)
83
+ return;
84
+ e.dataTransfer.effectAllowed = 'move';
85
+ e.dataTransfer.setData(DND_MIME, String(index));
86
+ onDragStart();
87
+ }, onDragEnd: onDragEnd, onDragOver: (e) => {
88
+ if (!canEdit || !dragging)
89
+ return;
90
+ if (!e.dataTransfer.types.includes(DND_MIME))
91
+ return;
92
+ e.preventDefault();
93
+ e.dataTransfer.dropEffect = 'move';
94
+ onDragOverRow();
95
+ }, onDrop: (e) => {
96
+ if (!canEdit)
97
+ return;
98
+ if (!e.dataTransfer.types.includes(DND_MIME))
99
+ return;
100
+ e.preventDefault();
101
+ e.stopPropagation();
102
+ onDropRow();
103
+ }, onClick: onSelect, onKeyDown: (e) => {
104
+ if (e.key === 'Enter' || e.key === ' ') {
105
+ e.preventDefault();
106
+ onSelect();
107
+ }
108
+ }, className: 'group flex items-center gap-2 rounded-md border bg-card px-2 py-1.5 text-xs transition-colors hover:border-primary/40 ' +
109
+ (selected ? 'border-primary ring-1 ring-primary ' : 'border-border ') +
110
+ (canEdit ? 'cursor-grab active:cursor-grabbing' : ''), children: [canEdit && (_jsx(GripVertical, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground/40 group-hover:text-muted-foreground" })), _jsx(FieldIcon, { type: fieldType }), _jsx("span", { className: "min-w-0 flex-1 truncate font-medium", children: label }), fieldName && fieldName !== label && (_jsx("code", { className: "max-w-[7rem] shrink-0 truncate text-[10px] text-muted-foreground", children: fieldName })), canEdit && (_jsx("span", { role: "button", tabIndex: 0, "aria-label": `Remove ${label}`, onClick: (e) => {
111
+ e.stopPropagation();
112
+ onRemove();
113
+ }, onKeyDown: (e) => {
114
+ if (e.key === 'Enter' || e.key === ' ') {
115
+ e.preventDefault();
116
+ e.stopPropagation();
117
+ onRemove();
118
+ }
119
+ }, className: "inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground/60 hover:bg-destructive/10 hover:text-destructive", children: _jsx(X, { className: "h-3 w-3" }) }))] })] }));
120
+ }
121
+ /* ─────────────────────────── Add-field popover ────────────────────────── */
122
+ export function AddFieldPopover({ fields, usedNames, loading, error, onAdd, }) {
123
+ const locale = React.useMemo(() => detectLocale(), []);
124
+ const [open, setOpen] = React.useState(false);
125
+ const [query, setQuery] = React.useState('');
126
+ const filtered = React.useMemo(() => {
127
+ const q = query.trim().toLowerCase();
128
+ if (!q)
129
+ return fields;
130
+ return fields.filter((f) => f.name.toLowerCase().includes(q) || f.label.toLowerCase().includes(q));
131
+ }, [fields, query]);
132
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex items-center gap-1 rounded-md border border-dashed px-2 py-1 text-xs text-muted-foreground hover:border-primary/40 hover:bg-accent/40 hover:text-foreground", children: [_jsx(Plus, { className: "h-3.5 w-3.5" }), " ", t('engine.form.addFieldPlain', locale)] }) }), _jsxs(PopoverContent, { align: "start", className: "w-72 p-0", children: [_jsxs("div", { className: "relative border-b p-2", children: [_jsx(Search, { className: "pointer-events-none absolute left-4 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { autoFocus: true, value: query, onChange: (e) => setQuery(e.target.value), placeholder: t('engine.form.searchFields', locale), className: "h-8 w-full rounded border border-input bg-background pl-7 pr-2 text-xs outline-none focus:border-primary" })] }), _jsx("div", { className: "max-h-72 overflow-auto p-1", children: loading ? (_jsx(Hint, { children: t('engine.form.loadingFields', locale) })) : error ? (_jsx(Hint, { tone: "warn", children: tFormat('engine.form.noObjectFields', locale, { error }) })) : filtered.length === 0 ? (_jsx(Hint, { children: query ? t('engine.form.noMatchingFields', locale) : t('engine.form.noFieldsOnObject', locale) })) : (filtered.map((f) => {
133
+ const used = usedNames.has(f.name);
134
+ return (_jsxs("button", { type: "button", onClick: () => onAdd(f), className: "flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-xs hover:bg-accent", children: [_jsx(FieldIcon, { type: f.type }), _jsx("span", { className: "min-w-0 flex-1 truncate font-medium", children: f.label }), f.name !== f.label && (_jsx("code", { className: "max-w-[6rem] truncate text-[10px] text-muted-foreground", children: f.name })), used && (_jsx(Badge, { variant: "secondary", className: "px-1 py-0 text-[9px]", children: t('engine.form.added', locale) }))] }, f.name));
135
+ })) })] })] }));
136
+ }
137
+ function Hint({ children, tone }) {
138
+ return (_jsx("div", { className: 'px-2 py-4 text-center text-[11px] ' +
139
+ (tone === 'warn' ? 'text-amber-600 dark:text-amber-300' : 'text-muted-foreground'), children: children }));
140
+ }
@@ -1,2 +1,24 @@
1
+ /**
2
+ * ViewPreview — renders a View metadata draft using the same `object-view`
3
+ * SchemaRenderer the runtime ObjectView route uses, with the draft's own
4
+ * `config` body injected as a named `listView` so the preview reflects the
5
+ * unsaved edit (not the last saved version).
6
+ *
7
+ * A view is the canonical first-class **ViewItem** ({ viewKind, config }):
8
+ * one view, one `config` body — there are no in-document variant tabs. An
9
+ * object's *other* views are independent ViewItems surfaced by the view
10
+ * switcher (a query), not nested here.
11
+ *
12
+ * The render path forks on `viewKind`:
13
+ * - list-family (grid / kanban / calendar / …) → `object-view`, with the
14
+ * draft body injected as a named listView (below);
15
+ * - form-family (simple / drawer / …) → `object-form`, with the draft's
16
+ * sections mapped onto the form schema (a form view binds a record layout,
17
+ * not a list, so the list renderer would just fall back to a bare grid).
18
+ *
19
+ * A raw single-schema draft (a bare `{ type, … }` with no `config` wrapper,
20
+ * e.g. an ad-hoc preview) is rendered straight through SchemaRenderer.
21
+ */
22
+ import * as React from 'react';
1
23
  import type { MetadataPreviewProps } from '../preview-registry';
2
- export declare function ViewPreview({ name, draft }: MetadataPreviewProps): import("react/jsx-runtime").JSX.Element;
24
+ export declare function ViewPreview({ name, draft, editing }: MetadataPreviewProps): React.JSX.Element;