@object-ui/app-shell 6.2.3 → 7.1.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 (486) hide show
  1. package/CHANGELOG.md +1229 -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 +184 -39
  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 +747 -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 +28 -0
  27. package/dist/console/ai/LiveCanvas.js +80 -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 +137 -4
  90. package/dist/hooks/useChatConversation.js +316 -25
  91. package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
  92. package/dist/hooks/useConsoleActionRuntime.js +564 -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 +18 -8
  110. package/dist/index.js +17 -5
  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 +34 -2
  124. package/dist/layout/ConsoleFloatingChatbot.js +391 -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 +242 -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/layout/agentPicker.d.ts +56 -0
  140. package/dist/layout/agentPicker.js +40 -0
  141. package/dist/observability/index.d.ts +1 -0
  142. package/dist/observability/index.js +1 -0
  143. package/dist/observability/settleSignal.d.ts +64 -0
  144. package/dist/observability/settleSignal.js +131 -0
  145. package/dist/preview/CommitTimeline.d.ts +15 -0
  146. package/dist/preview/CommitTimeline.js +82 -0
  147. package/dist/preview/DraftChangesPanel.d.ts +19 -0
  148. package/dist/preview/DraftChangesPanel.js +114 -0
  149. package/dist/preview/DraftPreviewBar.d.ts +8 -0
  150. package/dist/preview/DraftPreviewBar.js +86 -0
  151. package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
  152. package/dist/preview/PreviewDraftEmptyState.js +47 -0
  153. package/dist/preview/PreviewModeContext.d.ts +57 -0
  154. package/dist/preview/PreviewModeContext.js +99 -0
  155. package/dist/preview/UnpublishedAppBar.d.ts +8 -0
  156. package/dist/preview/UnpublishedAppBar.js +83 -0
  157. package/dist/preview/commitHistory.d.ts +28 -0
  158. package/dist/preview/commitHistory.js +48 -0
  159. package/dist/preview/draftStatus.d.ts +20 -0
  160. package/dist/preview/draftStatus.js +27 -0
  161. package/dist/preview/usePublishAllDrafts.d.ts +18 -0
  162. package/dist/preview/usePublishAllDrafts.js +106 -0
  163. package/dist/providers/AdapterProvider.d.ts +1 -1
  164. package/dist/providers/AdapterProvider.js +6 -1
  165. package/dist/providers/ExpressionProvider.d.ts +1 -1
  166. package/dist/providers/MetadataProvider.d.ts +17 -2
  167. package/dist/providers/MetadataProvider.js +192 -12
  168. package/dist/runtime-config.d.ts +46 -2
  169. package/dist/runtime-config.js +39 -2
  170. package/dist/services/builtinComponents.js +68 -59
  171. package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
  172. package/dist/skeletons/SkeletonDetail.d.ts +1 -1
  173. package/dist/skeletons/SkeletonGrid.d.ts +1 -1
  174. package/dist/utils/appRoute.d.ts +21 -0
  175. package/dist/utils/appRoute.js +25 -0
  176. package/dist/utils/deriveRelatedLists.d.ts +54 -0
  177. package/dist/utils/deriveRelatedLists.js +91 -0
  178. package/dist/utils/index.d.ts +4 -0
  179. package/dist/utils/index.js +3 -0
  180. package/dist/utils/managedByEmptyState.d.ts +8 -1
  181. package/dist/utils/managedByEmptyState.js +13 -7
  182. package/dist/utils/preferLocal.d.ts +18 -0
  183. package/dist/utils/preferLocal.js +24 -0
  184. package/dist/views/ActionConfirmDialog.d.ts +1 -1
  185. package/dist/views/ActionConfirmDialog.js +3 -1
  186. package/dist/views/ActionParamDialog.d.ts +6 -1
  187. package/dist/views/ActionParamDialog.js +9 -3
  188. package/dist/views/ActionResultDialog.d.ts +13 -0
  189. package/dist/views/ActionResultDialog.js +134 -0
  190. package/dist/views/ComponentNavView.d.ts +14 -1
  191. package/dist/views/CreateViewDialog.d.ts +1 -1
  192. package/dist/views/DashboardConfigPanel.d.ts +28 -0
  193. package/dist/views/DashboardConfigPanel.js +81 -0
  194. package/dist/views/DashboardView.d.ts +4 -3
  195. package/dist/views/DashboardView.js +38 -239
  196. package/dist/views/FlowRunner.d.ts +31 -0
  197. package/dist/views/FlowRunner.js +121 -0
  198. package/dist/views/InterfaceListPage.d.ts +49 -0
  199. package/dist/views/InterfaceListPage.js +347 -0
  200. package/dist/views/MetadataInspector.d.ts +2 -2
  201. package/dist/views/ObjectView.d.ts +1 -1
  202. package/dist/views/ObjectView.js +209 -532
  203. package/dist/views/PageView.d.ts +8 -3
  204. package/dist/views/PageView.js +45 -32
  205. package/dist/views/RecordDetailView.d.ts +1 -1
  206. package/dist/views/RecordDetailView.js +363 -148
  207. package/dist/views/RecordFormPage.d.ts +1 -1
  208. package/dist/views/RecordFormPage.js +26 -1
  209. package/dist/views/ReportConfigPanel.d.ts +37 -0
  210. package/dist/views/ReportConfigPanel.js +85 -0
  211. package/dist/views/ReportView.d.ts +1 -1
  212. package/dist/views/ReportView.js +116 -7
  213. package/dist/views/RuntimeDraftBar.d.ts +30 -0
  214. package/dist/views/RuntimeDraftBar.js +112 -0
  215. package/dist/views/ScreenView.d.ts +70 -0
  216. package/dist/views/ScreenView.js +73 -0
  217. package/dist/views/SearchResultsPage.d.ts +1 -1
  218. package/dist/views/SearchResultsPage.js +8 -18
  219. package/dist/views/ViewConfigPanel.d.ts +24 -17
  220. package/dist/views/ViewConfigPanel.js +121 -77
  221. package/dist/views/index.d.ts +1 -1
  222. package/dist/views/index.js +1 -1
  223. package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
  224. package/dist/views/metadata-admin/AuditPanel.js +79 -0
  225. package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
  226. package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
  227. package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
  228. package/dist/views/metadata-admin/DirectoryPage.js +101 -24
  229. package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
  230. package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
  231. package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
  232. package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
  233. package/dist/views/metadata-admin/JsonSourceEditor.d.ts +39 -0
  234. package/dist/views/metadata-admin/JsonSourceEditor.js +196 -0
  235. package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
  236. package/dist/views/metadata-admin/LayeredDiff.js +171 -5
  237. package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
  238. package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
  239. package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
  240. package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
  241. package/dist/views/metadata-admin/PackagesPage.js +403 -0
  242. package/dist/views/metadata-admin/PageShell.d.ts +1 -1
  243. package/dist/views/metadata-admin/PageShell.js +9 -4
  244. package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
  245. package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
  246. package/dist/views/metadata-admin/QuickFind.js +6 -3
  247. package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
  248. package/dist/views/metadata-admin/RelatedPanel.js +20 -18
  249. package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
  250. package/dist/views/metadata-admin/ResourceEditPage.js +1250 -60
  251. package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
  252. package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
  253. package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
  254. package/dist/views/metadata-admin/ResourceListPage.js +258 -30
  255. package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
  256. package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
  257. package/dist/views/metadata-admin/SchemaForm.js +559 -49
  258. package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
  259. package/dist/views/metadata-admin/StudioHomePage.js +205 -0
  260. package/dist/views/metadata-admin/anchors.js +255 -24
  261. package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
  262. package/dist/views/metadata-admin/clientValidation.js +169 -0
  263. package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
  264. package/dist/views/metadata-admin/color-variant-field.js +38 -0
  265. package/dist/views/metadata-admin/createDerive.d.ts +75 -0
  266. package/dist/views/metadata-admin/createDerive.js +179 -0
  267. package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
  268. package/dist/views/metadata-admin/dashboard-schema.js +80 -0
  269. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
  270. package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
  271. package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
  272. package/dist/views/metadata-admin/datasource/register.js +24 -0
  273. package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
  274. package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
  275. package/dist/views/metadata-admin/default-schemas.js +115 -10
  276. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
  277. package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
  278. package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
  279. package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
  280. package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
  281. package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
  282. package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
  283. package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
  284. package/dist/views/metadata-admin/external/api.d.ts +100 -0
  285. package/dist/views/metadata-admin/external/api.js +124 -0
  286. package/dist/views/metadata-admin/i18n.d.ts +1 -0
  287. package/dist/views/metadata-admin/i18n.js +1252 -2
  288. package/dist/views/metadata-admin/index.d.ts +8 -5
  289. package/dist/views/metadata-admin/index.js +12 -2
  290. package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
  291. package/dist/views/metadata-admin/inspector-registry.js +11 -0
  292. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
  293. package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
  294. package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
  295. package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
  296. package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
  297. package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
  298. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
  299. package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
  300. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
  301. package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
  302. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
  303. package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +221 -0
  304. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
  305. package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +126 -0
  306. package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
  307. package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
  308. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
  309. package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
  310. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
  311. package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
  312. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
  313. package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +205 -0
  314. package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
  315. package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
  316. package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
  317. package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
  318. package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
  319. package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
  320. package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
  321. package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
  322. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
  323. package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +55 -0
  324. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
  325. package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +365 -0
  326. package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
  327. package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
  328. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
  329. package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +218 -0
  330. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
  331. package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
  332. package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
  333. package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
  334. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
  335. package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
  336. package/dist/views/metadata-admin/inspectors/_shared.d.ts +128 -0
  337. package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
  338. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.d.ts +24 -0
  339. package/dist/views/metadata-admin/inspectors/datasetFilterCondition.js +97 -0
  340. package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
  341. package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
  342. package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
  343. package/dist/views/metadata-admin/inspectors/flow-node-config.js +506 -0
  344. package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
  345. package/dist/views/metadata-admin/inspectors/index.js +45 -0
  346. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
  347. package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
  348. package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
  349. package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
  350. package/dist/views/metadata-admin/issuePath.d.ts +22 -0
  351. package/dist/views/metadata-admin/issuePath.js +65 -0
  352. package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
  353. package/dist/views/metadata-admin/mergeServerFields.js +56 -0
  354. package/dist/views/metadata-admin/package-scope.d.ts +26 -0
  355. package/dist/views/metadata-admin/package-scope.js +43 -0
  356. package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
  357. package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
  358. package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
  359. package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
  360. package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
  361. package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
  362. package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
  363. package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
  364. package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
  365. package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
  366. package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
  367. package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
  368. package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
  369. package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
  370. package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
  371. package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
  372. package/dist/views/metadata-admin/previews/DatasetPreview.js +105 -0
  373. package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
  374. package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
  375. package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
  376. package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
  377. package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
  378. package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
  379. package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
  380. package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +49 -0
  381. package/dist/views/metadata-admin/previews/FlowCanvas.js +416 -0
  382. package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
  383. package/dist/views/metadata-admin/previews/FlowPreview.js +120 -0
  384. package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
  385. package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
  386. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
  387. package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +204 -0
  388. package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
  389. package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
  390. package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
  391. package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
  392. package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
  393. package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
  394. package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
  395. package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
  396. package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
  397. package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
  398. package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
  399. package/dist/views/metadata-admin/previews/PagePreview.js +200 -5
  400. package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
  401. package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
  402. package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
  403. package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
  404. package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
  405. package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
  406. package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
  407. package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
  408. package/dist/views/metadata-admin/previews/ScreenPreview.d.ts +38 -0
  409. package/dist/views/metadata-admin/previews/ScreenPreview.js +61 -0
  410. package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
  411. package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
  412. package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
  413. package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
  414. package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
  415. package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
  416. package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
  417. package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
  418. package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
  419. package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
  420. package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
  421. package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
  422. package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
  423. package/dist/views/metadata-admin/previews/block-config.js +324 -0
  424. package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
  425. package/dist/views/metadata-admin/previews/block-types.js +110 -0
  426. package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
  427. package/dist/views/metadata-admin/previews/field-types.js +97 -0
  428. package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +102 -0
  429. package/dist/views/metadata-admin/previews/flow-canvas-layout.js +227 -0
  430. package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +96 -0
  431. package/dist/views/metadata-admin/previews/flow-canvas-parts.js +373 -0
  432. package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
  433. package/dist/views/metadata-admin/previews/form-preview.js +29 -0
  434. package/dist/views/metadata-admin/previews/index.js +43 -0
  435. package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
  436. package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
  437. package/dist/views/metadata-admin/previews/object-fields-io.d.ts +130 -0
  438. package/dist/views/metadata-admin/previews/object-fields-io.js +243 -0
  439. package/dist/views/metadata-admin/previews/screen-spec.d.ts +43 -0
  440. package/dist/views/metadata-admin/previews/screen-spec.js +108 -0
  441. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +102 -0
  442. package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
  443. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +15 -0
  444. package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +185 -0
  445. package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +73 -0
  446. package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +426 -0
  447. package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
  448. package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
  449. package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
  450. package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
  451. package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
  452. package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
  453. package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
  454. package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
  455. package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
  456. package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
  457. package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
  458. package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
  459. package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
  460. package/dist/views/metadata-admin/previews/widget-types.js +40 -0
  461. package/dist/views/metadata-admin/registry.d.ts +140 -19
  462. package/dist/views/metadata-admin/report-schema.d.ts +26 -0
  463. package/dist/views/metadata-admin/report-schema.js +121 -0
  464. package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
  465. package/dist/views/metadata-admin/useMetadata.js +155 -4
  466. package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
  467. package/dist/views/metadata-admin/view-item-normalize.js +68 -0
  468. package/dist/views/metadata-admin/view-schema.d.ts +16 -0
  469. package/dist/views/metadata-admin/view-schema.js +107 -0
  470. package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
  471. package/dist/views/metadata-admin/view-variant-model.js +64 -0
  472. package/dist/views/metadata-admin/widgets.d.ts +89 -1
  473. package/dist/views/metadata-admin/widgets.js +491 -17
  474. package/dist/views/runtime-metadata-persistence.d.ts +78 -0
  475. package/dist/views/runtime-metadata-persistence.js +89 -0
  476. package/dist/views/useOpenRecordList.d.ts +18 -0
  477. package/dist/views/useOpenRecordList.js +36 -0
  478. package/dist/views/userFilterUrlState.d.ts +15 -0
  479. package/dist/views/userFilterUrlState.js +53 -0
  480. package/dist/views/view-config-adapter.d.ts +38 -0
  481. package/dist/views/view-config-adapter.js +80 -0
  482. package/package.json +52 -34
  483. package/dist/views/DesignDrawer.d.ts +0 -28
  484. package/dist/views/DesignDrawer.js +0 -51
  485. package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
  486. package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
@@ -0,0 +1,260 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * AppNavCanvas — form-canvas-style editor for an App's top-level
5
+ * navigation tree. Each nav entry becomes a card with a drag handle,
6
+ * a kind icon, an inline-rename label, the bound path, and a remove
7
+ * affordance on hover. Drag-drop reorders within the root list.
8
+ *
9
+ * Nested children are rendered indented; cross-level moves and
10
+ * adding child items are still handled by AppNavInspector (the
11
+ * canvas keeps DnD focused on the root list to avoid surprising
12
+ * cross-tree reorders).
13
+ *
14
+ * Selection IDs match AppNavInspector:
15
+ * { kind: 'nav', id: `${rootKey}[${i}]` }
16
+ * { kind: 'nav', id: `${rootKey}[${i}].children[${j}]` }
17
+ */
18
+ import * as React from 'react';
19
+ import { BarChart3, Compass, Database, FileText, Folder, GripVertical, LayoutDashboard, Link as LinkIcon, Plus, Trash2, } from 'lucide-react';
20
+ import { Badge, cn } from '@object-ui/components';
21
+ import { appendArray, moveArray, spliceArray } from '../inspectors/_shared';
22
+ const DND_MIME = 'text/x-objectui-nav';
23
+ function inferKind(it) {
24
+ if (it.kind)
25
+ return String(it.kind);
26
+ if (it.object || it.objectName)
27
+ return 'object';
28
+ if (it.page || it.pageName)
29
+ return 'page';
30
+ if (it.dashboard)
31
+ return 'dashboard';
32
+ if (it.report)
33
+ return 'report';
34
+ if (Array.isArray(it.children) && it.children.length)
35
+ return 'group';
36
+ const path = it.path ?? it.href ?? it.route ?? it.url;
37
+ if (typeof path === 'string' && /^https?:/i.test(path))
38
+ return 'link';
39
+ return 'item';
40
+ }
41
+ function kindIcon(kind) {
42
+ switch (kind) {
43
+ case 'object':
44
+ return Database;
45
+ case 'page':
46
+ return FileText;
47
+ case 'dashboard':
48
+ return LayoutDashboard;
49
+ case 'report':
50
+ return BarChart3;
51
+ case 'link':
52
+ return LinkIcon;
53
+ case 'group':
54
+ return Folder;
55
+ default:
56
+ return Compass;
57
+ }
58
+ }
59
+ const KIND_TONE = {
60
+ object: {
61
+ icon: 'text-blue-500',
62
+ badge: 'border-blue-200 bg-blue-50 text-blue-700 dark:border-blue-900 dark:bg-blue-950/40 dark:text-blue-300',
63
+ },
64
+ page: {
65
+ icon: 'text-violet-500',
66
+ badge: 'border-violet-200 bg-violet-50 text-violet-700 dark:border-violet-900 dark:bg-violet-950/40 dark:text-violet-300',
67
+ },
68
+ dashboard: {
69
+ icon: 'text-teal-500',
70
+ badge: 'border-teal-200 bg-teal-50 text-teal-700 dark:border-teal-900 dark:bg-teal-950/40 dark:text-teal-300',
71
+ },
72
+ report: {
73
+ icon: 'text-amber-500',
74
+ badge: 'border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-900 dark:bg-amber-950/40 dark:text-amber-300',
75
+ },
76
+ link: {
77
+ icon: 'text-indigo-500',
78
+ badge: 'border-indigo-200 bg-indigo-50 text-indigo-700 dark:border-indigo-900 dark:bg-indigo-950/40 dark:text-indigo-300',
79
+ },
80
+ group: {
81
+ icon: 'text-slate-500',
82
+ badge: 'border-slate-200 bg-slate-50 text-slate-700 dark:border-slate-800 dark:bg-slate-900/40 dark:text-slate-300',
83
+ },
84
+ item: {
85
+ icon: 'text-zinc-500',
86
+ badge: 'border-zinc-200 bg-zinc-50 text-zinc-600 dark:border-zinc-800 dark:bg-zinc-900/40 dark:text-zinc-400',
87
+ },
88
+ };
89
+ function kindTone(kind) {
90
+ return KIND_TONE[kind] ?? KIND_TONE.item;
91
+ }
92
+ function navLabel(it, i) {
93
+ const l = it.label ?? it.title ?? it.name ?? it.path;
94
+ if (typeof l === 'string' && l.trim())
95
+ return l.trim();
96
+ return `Item ${i + 1}`;
97
+ }
98
+ function navPath(it) {
99
+ const p = it.path ?? it.href ?? it.route ?? it.url;
100
+ return typeof p === 'string' && p ? p : undefined;
101
+ }
102
+ export function AppNavCanvas({ draft, rootKey, onPatch, selection, onSelectionChange, }) {
103
+ const items = React.useMemo(() => {
104
+ const v = draft[rootKey];
105
+ return Array.isArray(v) ? v : [];
106
+ }, [draft, rootKey]);
107
+ const selectedId = selection && selection.kind === 'nav' ? selection.id : null;
108
+ const [dragIndex, setDragIndex] = React.useState(null);
109
+ const setItems = React.useCallback((next) => {
110
+ if (!onPatch)
111
+ return;
112
+ onPatch({ [rootKey]: next });
113
+ }, [onPatch, rootKey]);
114
+ const addItem = React.useCallback(() => {
115
+ if (!onPatch)
116
+ return;
117
+ const newItem = { label: 'New item', path: '' };
118
+ const next = appendArray(items, newItem);
119
+ setItems(next);
120
+ onSelectionChange?.({
121
+ kind: 'nav',
122
+ id: `${rootKey}[${next.length - 1}]`,
123
+ label: 'New item',
124
+ });
125
+ }, [onPatch, items, setItems, rootKey, onSelectionChange]);
126
+ const removeItem = React.useCallback((index) => {
127
+ if (!onPatch)
128
+ return;
129
+ const next = spliceArray(items, index, null);
130
+ setItems(next);
131
+ if (selectedId === `${rootKey}[${index}]`)
132
+ onSelectionChange?.(null);
133
+ }, [onPatch, items, setItems, rootKey, selectedId, onSelectionChange]);
134
+ const renameItem = React.useCallback((index, nextLabel) => {
135
+ if (!onPatch)
136
+ return;
137
+ const cur = items[index] ?? {};
138
+ const updated = { ...cur, label: nextLabel };
139
+ const next = spliceArray(items, index, updated);
140
+ setItems(next);
141
+ if (selectedId === `${rootKey}[${index}]`) {
142
+ onSelectionChange?.({ kind: 'nav', id: `${rootKey}[${index}]`, label: nextLabel });
143
+ }
144
+ }, [onPatch, items, setItems, rootKey, selectedId, onSelectionChange]);
145
+ const moveItem = React.useCallback((from, before) => {
146
+ if (!onPatch)
147
+ return;
148
+ let to = before;
149
+ if (from < before)
150
+ to = before - 1;
151
+ if (to === from)
152
+ return;
153
+ const next = moveArray(items, from, to);
154
+ setItems(next);
155
+ onSelectionChange?.({
156
+ kind: 'nav',
157
+ id: `${rootKey}[${to}]`,
158
+ label: navLabel(next[to] ?? {}, to),
159
+ });
160
+ }, [onPatch, items, setItems, rootKey, onSelectionChange]);
161
+ return (_jsxs("div", { className: "rounded-md border bg-card/40", children: [_jsxs("div", { className: "flex items-center justify-between border-b px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx("span", { className: "font-mono uppercase tracking-wide text-muted-foreground", children: rootKey }), _jsxs(Badge, { variant: "outline", className: "text-[10px]", children: [items.length, " ", items.length === 1 ? 'item' : 'items'] })] }), onPatch && (_jsxs("button", { type: "button", className: "inline-flex items-center gap-1 rounded border border-dashed px-2 py-1 text-[11px] text-muted-foreground hover:bg-muted/30 hover:text-foreground", onClick: addItem, children: [_jsx(Plus, { className: "h-3 w-3" }), " Add nav item"] }))] }), _jsx("div", { className: "space-y-1.5 p-2", onDragOver: (e) => {
162
+ if (!onPatch)
163
+ return;
164
+ if (!e.dataTransfer.types.includes(DND_MIME))
165
+ return;
166
+ e.preventDefault();
167
+ e.dataTransfer.dropEffect = 'move';
168
+ }, onDrop: (e) => {
169
+ if (!onPatch)
170
+ return;
171
+ if (!e.dataTransfer.types.includes(DND_MIME))
172
+ return;
173
+ e.preventDefault();
174
+ if (dragIndex == null)
175
+ return;
176
+ moveItem(dragIndex, items.length);
177
+ setDragIndex(null);
178
+ }, children: items.length === 0 ? (_jsx("div", { className: "rounded border border-dashed px-3 py-4 text-center text-[11px] text-muted-foreground", children: onPatch
179
+ ? 'Empty — click "Add nav item" to start'
180
+ : 'No top-level nav items yet' })) : (items.map((it, i) => (_jsx(NavCardTree, { item: it, index: i, depth: 0, path: `${rootKey}[${i}]`, selectedId: selectedId, canEdit: !!onPatch, onClick: (p, lbl) => onSelectionChange?.({ kind: 'nav', id: p, label: lbl }), onRename: (lbl) => renameItem(i, lbl), onRemove: () => removeItem(i), onDragStart: () => setDragIndex(i), onDragEnd: () => setDragIndex(null), onDropBefore: () => {
181
+ if (dragIndex == null)
182
+ return;
183
+ moveItem(dragIndex, i);
184
+ setDragIndex(null);
185
+ } }, i)))) })] }));
186
+ }
187
+ function NavCardTree({ item, index, depth, path, selectedId, canEdit, onClick, onRename, onRemove, onDragStart, onDragEnd, onDropBefore, }) {
188
+ return (_jsxs(_Fragment, { children: [_jsx(NavCard, { item: item, index: index, depth: depth, path: path, isSelected: selectedId === path, canEdit: canEdit && depth === 0, onClick: () => onClick(path, navLabel(item, index)), onRename: onRename, onRemove: onRemove, onDragStart: onDragStart, onDragEnd: onDragEnd, onDropBefore: onDropBefore }), Array.isArray(item.children) &&
189
+ item.children.map((c, j) => {
190
+ const childPath = `${path}.children[${j}]`;
191
+ return (_jsx(NavCardTree, { item: c, index: j, depth: depth + 1, path: childPath, selectedId: selectedId, canEdit: canEdit, onClick: onClick, onRename: () => undefined, onRemove: () => undefined, onDragStart: () => undefined, onDragEnd: () => undefined, onDropBefore: () => undefined }, j));
192
+ })] }));
193
+ }
194
+ function NavCard({ item, index, depth, path, isSelected, canEdit, onClick, onRename, onRemove, onDragStart, onDragEnd, onDropBefore, }) {
195
+ const kind = inferKind(item);
196
+ const Icon = kindIcon(kind);
197
+ const tone = kindTone(kind);
198
+ const path0 = navPath(item);
199
+ const [editing, setEditing] = React.useState(false);
200
+ const [draft, setDraft] = React.useState(navLabel(item, index));
201
+ const [hover, setHover] = React.useState(false);
202
+ const [dropPos, setDropPos] = React.useState(null);
203
+ React.useEffect(() => {
204
+ if (!editing)
205
+ setDraft(navLabel(item, index));
206
+ }, [item, index, editing]);
207
+ return (_jsxs("div", { className: "relative", style: { paddingLeft: depth * 16 }, children: [dropPos === 'before' && (_jsx("div", { className: "pointer-events-none absolute inset-x-0 -top-0.5 h-0.5 rounded bg-primary" })), _jsxs("button", { type: "button", draggable: canEdit && !editing, onDragStart: (e) => {
208
+ if (!canEdit)
209
+ return;
210
+ e.dataTransfer.effectAllowed = 'move';
211
+ e.dataTransfer.setData(DND_MIME, path);
212
+ onDragStart();
213
+ }, onDragEnd: onDragEnd, onDragOver: (e) => {
214
+ if (!canEdit)
215
+ return;
216
+ if (!e.dataTransfer.types.includes(DND_MIME))
217
+ return;
218
+ e.preventDefault();
219
+ e.dataTransfer.dropEffect = 'move';
220
+ setDropPos('before');
221
+ }, onDragLeave: () => setDropPos(null), onDrop: (e) => {
222
+ if (!canEdit)
223
+ return;
224
+ if (!e.dataTransfer.types.includes(DND_MIME))
225
+ return;
226
+ e.preventDefault();
227
+ e.stopPropagation();
228
+ setDropPos(null);
229
+ onDropBefore();
230
+ }, onClick: onClick, onMouseEnter: () => setHover(true), onMouseLeave: () => setHover(false), "aria-pressed": isSelected, className: `group flex w-full items-center gap-2 rounded-md border bg-card px-2.5 py-2 text-left text-xs transition-colors hover:border-primary/40 ${isSelected ? 'border-primary ring-1 ring-primary' : 'border-border'} ${canEdit && !editing ? 'cursor-grab active:cursor-grabbing' : ''}`, children: [canEdit ? (_jsx(GripVertical, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground/50 group-hover:text-muted-foreground" })) : (_jsx("span", { className: "w-3.5" })), _jsx(Icon, { className: cn('h-3.5 w-3.5 shrink-0', tone.icon) }), editing ? (_jsx("input", { autoFocus: true, value: draft, onChange: (e) => setDraft(e.target.value), onClick: (e) => e.stopPropagation(), onBlur: () => {
231
+ setEditing(false);
232
+ const v = draft.trim();
233
+ if (v && v !== navLabel(item, index))
234
+ onRename(v);
235
+ }, onKeyDown: (e) => {
236
+ if (e.key === 'Enter') {
237
+ e.preventDefault();
238
+ e.target.blur();
239
+ }
240
+ else if (e.key === 'Escape') {
241
+ e.preventDefault();
242
+ setDraft(navLabel(item, index));
243
+ setEditing(false);
244
+ }
245
+ }, className: "flex-1 min-w-0 rounded border border-input bg-background px-1.5 py-0.5 text-xs outline-none focus:border-primary" })) : (_jsx("span", { className: "flex-1 min-w-0 truncate font-medium", onDoubleClick: (e) => {
246
+ if (!canEdit)
247
+ return;
248
+ e.stopPropagation();
249
+ setEditing(true);
250
+ }, children: navLabel(item, index) })), _jsx(Badge, { variant: "outline", className: cn('text-[10px] font-medium', tone.badge), children: kind }), path0 && (_jsx("code", { className: "ml-0 text-[10px] text-muted-foreground truncate max-w-[10rem]", children: path0 })), canEdit && hover && !editing && (_jsx("span", { role: "button", tabIndex: 0, onClick: (e) => {
251
+ e.stopPropagation();
252
+ onRemove();
253
+ }, onKeyDown: (e) => {
254
+ if (e.key === 'Enter' || e.key === ' ') {
255
+ e.preventDefault();
256
+ e.stopPropagation();
257
+ onRemove();
258
+ }
259
+ }, className: "inline-flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive", "aria-label": "Remove nav item", children: _jsx(Trash2, { className: "h-3 w-3" }) }))] })] }));
260
+ }
@@ -1,2 +1,17 @@
1
+ /**
2
+ * AppPreview — visual summary of an App metadata record's nav and
3
+ * landing route, since rendering a full nested AppShell inside the
4
+ * admin would be confusing (nav-within-nav).
5
+ *
6
+ * Shows:
7
+ * • App label/icon + landing route
8
+ * • Top-level navigation items (tabs/menu) as a clickable list —
9
+ * each link opens the runtime app in a new tab so authors can
10
+ * test the configured nav without leaving the editor.
11
+ *
12
+ * If the App schema doesn't follow the expected shape we degrade to
13
+ * a "no preview" hint rather than throw.
14
+ */
15
+ import * as React from 'react';
1
16
  import type { MetadataPreviewProps } from '../preview-registry';
2
- export declare function AppPreview({ name, draft }: MetadataPreviewProps): import("react/jsx-runtime").JSX.Element;
17
+ export declare function AppPreview({ name, draft, editing, selection, onSelectionChange, onPatch }: MetadataPreviewProps): React.JSX.Element;
@@ -17,6 +17,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
17
17
  import * as React from 'react';
18
18
  import { Compass, ExternalLink, LayoutDashboard, FileText, Database, BarChart3 } from 'lucide-react';
19
19
  import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
20
+ import { AppNavCanvas } from './AppNavCanvas';
20
21
  function normalizeNav(raw) {
21
22
  if (!Array.isArray(raw))
22
23
  return [];
@@ -61,32 +62,40 @@ function kindIcon(kind) {
61
62
  return Compass;
62
63
  }
63
64
  }
64
- export function AppPreview({ name, draft }) {
65
+ export function AppPreview({ name, draft, editing, selection, onSelectionChange, onPatch }) {
65
66
  const appName = String(draft.name ?? name ?? '');
66
67
  const label = draft.label ?? appName;
67
68
  const landing = draft.landingRoute ?? draft.landing ?? draft.defaultRoute ?? '/';
68
- const navItems = React.useMemo(() => {
69
- // Accept the most common shapes used by app schemas in the wild.
69
+ const { rootKey, navItems } = React.useMemo(() => {
70
70
  const candidates = [
71
- draft.nav,
72
- draft.navigation,
73
- draft.tabs,
74
- draft.items,
75
- draft.menu,
71
+ ['nav', draft.nav],
72
+ ['navigation', draft.navigation],
73
+ ['tabs', draft.tabs],
74
+ ['items', draft.items],
75
+ ['menu', draft.menu],
76
76
  ];
77
- for (const c of candidates) {
77
+ for (const [k, c] of candidates) {
78
78
  if (Array.isArray(c) && c.length)
79
- return normalizeNav(c);
79
+ return { rootKey: k, navItems: normalizeNav(c) };
80
80
  }
81
- return [];
81
+ return { rootKey: null, navItems: [] };
82
82
  }, [draft]);
83
+ // For Add we need a root key even when empty — default to "nav".
84
+ const addRootKey = rootKey ?? 'nav';
85
+ const designMode = !!(editing && onSelectionChange);
86
+ const canEdit = designMode && !!onPatch;
87
+ const selectedId = selection && selection.kind === 'nav' ? selection.id : null;
88
+ const onSelect = designMode
89
+ ? (path, item) => onSelectionChange({ kind: 'nav', id: path, label: item.label })
90
+ : undefined;
83
91
  const baseRuntimeUrl = appName ? `/apps/${encodeURIComponent(appName)}/` : null;
84
- return (_jsx(PreviewShell, { hint: "app", toolbar: baseRuntimeUrl && (_jsxs("a", { href: baseRuntimeUrl, target: "_blank", rel: "noreferrer", className: "text-xs text-muted-foreground hover:text-foreground inline-flex items-center gap-1", title: "Open this app in a new tab", children: ["Open ", _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", children: [_jsx("div", { className: "text-sm font-medium text-foreground", children: String(label) }), _jsx("div", { className: "text-xs text-muted-foreground font-mono mt-0.5", children: appName }), _jsxs("div", { className: "text-xs text-muted-foreground mt-1", children: ["Landing: ", _jsx("code", { className: "font-mono", children: String(landing) })] })] }), navItems.length === 0 ? (_jsxs(PreviewMessage, { children: ["No top-level nav items. Add ", _jsx("code", { children: "nav" }), " / ", _jsx("code", { children: "tabs" }), " entries in the Form tab to populate the app's navigation."] })) : (_jsx("div", { className: "border rounded divide-y", children: navItems.map((item, i) => (_jsx(NavRow, { item: item, appName: appName, depth: 0 }, i))) }))] }) }) }));
92
+ return (_jsx(PreviewShell, { hint: "app", toolbar: baseRuntimeUrl && (_jsxs("a", { href: baseRuntimeUrl, target: "_blank", rel: "noreferrer", className: "text-xs text-muted-foreground hover:text-foreground inline-flex items-center gap-1", title: "Open this app in a new tab", children: ["Open ", _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", children: [_jsx("div", { className: "text-sm font-medium text-foreground", children: String(label) }), _jsx("div", { className: "text-xs text-muted-foreground font-mono mt-0.5", children: appName }), _jsxs("div", { className: "text-xs text-muted-foreground mt-1", children: ["Landing: ", _jsx("code", { className: "font-mono", children: String(landing) })] })] }), designMode ? (_jsx(AppNavCanvas, { draft: draft, rootKey: addRootKey, onPatch: canEdit ? onPatch : undefined, selection: selection ?? null, onSelectionChange: onSelectionChange })) : navItems.length === 0 ? (_jsxs(PreviewMessage, { children: ["No top-level nav items. Add ", _jsx("code", { children: "nav" }), " / ", _jsx("code", { children: "tabs" }), " entries in the Form tab to populate the app's navigation."] })) : (_jsx("div", { className: "border rounded divide-y", children: navItems.map((item, i) => (_jsx(NavRow, { item: item, appName: appName, depth: 0, path: `${rootKey}[${i}]`, onSelect: onSelect, selectedId: selectedId }, i))) }))] }) }) }));
85
93
  }
86
- function NavRow({ item, appName, depth }) {
94
+ function NavRow({ item, appName, depth, path, onSelect, selectedId, }) {
87
95
  const Icon = kindIcon(item.kind);
88
96
  const url = buildUrl(appName, item.path);
89
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2 px-3 py-2 text-xs hover:bg-accent/40", style: { paddingLeft: `${12 + depth * 16}px` }, children: [_jsx(Icon, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }), _jsx("span", { className: "font-medium truncate", children: item.label }), item.kind && (_jsx("span", { className: "text-[10px] uppercase tracking-wider opacity-60", children: item.kind })), url && (_jsxs("a", { href: url, target: "_blank", rel: "noreferrer", className: "ml-auto font-mono text-[10px] text-muted-foreground hover:text-foreground inline-flex items-center gap-1", children: [item.path, " ", _jsx(ExternalLink, { className: "h-3 w-3" })] }))] }), item.children?.map((c, i) => (_jsx(NavRow, { item: c, appName: appName, depth: depth + 1 }, i)))] }));
97
+ const selected = selectedId === path;
98
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: `flex items-center gap-2 px-3 py-2 text-xs hover:bg-accent/40 ${onSelect ? 'cursor-pointer' : ''} ${selected ? 'bg-primary/5 ring-1 ring-primary' : ''}`, style: { paddingLeft: `${12 + depth * 16}px` }, onClick: onSelect ? (e) => { e.stopPropagation(); onSelect(path, item); } : undefined, children: [_jsx(Icon, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }), _jsx("span", { className: "font-medium truncate", children: item.label }), item.kind && (_jsx("span", { className: "text-[10px] uppercase tracking-wider opacity-60", children: item.kind })), url && (_jsxs("a", { href: url, target: "_blank", rel: "noreferrer", onClick: (e) => e.stopPropagation(), className: "ml-auto font-mono text-[10px] text-muted-foreground hover:text-foreground inline-flex items-center gap-1", children: [item.path, " ", _jsx(ExternalLink, { className: "h-3 w-3" })] }))] }), item.children?.map((c, i) => (_jsx(NavRow, { item: c, appName: appName, depth: depth + 1, path: `${path}.children[${i}]`, onSelect: onSelect, selectedId: selectedId }, i)))] }));
90
99
  }
91
100
  function buildUrl(appName, path) {
92
101
  if (!path)
@@ -0,0 +1,20 @@
1
+ /**
2
+ * BookPreview — visualises a `book` metadata record's navigation spine
3
+ * (ADR-0046 §6). A book is the *spine* of a table of contents: an ordered
4
+ * set of groups (sections) plus identity and access. It deliberately does
5
+ * NOT store its members — membership is **derived** at render time from a
6
+ * rule on each group (`include` glob/tag) plus per-doc `order`/`group`.
7
+ *
8
+ * Because the derived doc set isn't present in the draft (it's resolved
9
+ * server-side from the current doc set via `GET /meta/book/:name/tree`),
10
+ * this preview renders the *authored spine*: each group, its membership
11
+ * rule, and any explicit `pages` override (the curated-order escape hatch,
12
+ * incl. `---` separators, `...` rest, and external links). A toolbar link
13
+ * opens the live-resolved tree so authors can verify which docs land where.
14
+ *
15
+ * Drafts can be incomplete or invalid (validation may be in progress), so
16
+ * every field is read defensively and we degrade to a hint rather than throw.
17
+ */
18
+ import * as React from 'react';
19
+ import type { MetadataPreviewProps } from '../preview-registry';
20
+ export declare function BookPreview({ name, draft }: MetadataPreviewProps): React.JSX.Element;
@@ -0,0 +1,132 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
3
+ /**
4
+ * BookPreview — visualises a `book` metadata record's navigation spine
5
+ * (ADR-0046 §6). A book is the *spine* of a table of contents: an ordered
6
+ * set of groups (sections) plus identity and access. It deliberately does
7
+ * NOT store its members — membership is **derived** at render time from a
8
+ * rule on each group (`include` glob/tag) plus per-doc `order`/`group`.
9
+ *
10
+ * Because the derived doc set isn't present in the draft (it's resolved
11
+ * server-side from the current doc set via `GET /meta/book/:name/tree`),
12
+ * this preview renders the *authored spine*: each group, its membership
13
+ * rule, and any explicit `pages` override (the curated-order escape hatch,
14
+ * incl. `---` separators, `...` rest, and external links). A toolbar link
15
+ * opens the live-resolved tree so authors can verify which docs land where.
16
+ *
17
+ * Drafts can be incomplete or invalid (validation may be in progress), so
18
+ * every field is read defensively and we degrade to a hint rather than throw.
19
+ */
20
+ import * as React from 'react';
21
+ import { BookOpen, FolderTree, FileText, ExternalLink, Globe, Lock, Building2, Tag, Minus, MoreHorizontal, Package, } from 'lucide-react';
22
+ import { PreviewShell, PreviewErrorBoundary, PreviewEmptyState } from './PreviewShell';
23
+ /** Normalise an untrusted `groups` array into a defensively-typed shape. */
24
+ function normalizeGroups(raw) {
25
+ if (!Array.isArray(raw))
26
+ return [];
27
+ const groups = raw
28
+ .map((g, i) => {
29
+ if (!g || typeof g !== 'object')
30
+ return null;
31
+ const key = String(g.key ?? '').trim();
32
+ const label = String(g.label ?? key ?? '').trim();
33
+ if (!key && !label)
34
+ return null;
35
+ return {
36
+ g: {
37
+ key: key || '(no key)',
38
+ label: label || key || '(unnamed)',
39
+ order: typeof g.order === 'number' ? g.order : undefined,
40
+ include: normalizeInclude(g.include),
41
+ package: typeof g.package === 'string' ? g.package : undefined,
42
+ pages: normalizePages(g.pages),
43
+ },
44
+ i,
45
+ };
46
+ })
47
+ .filter((x) => x !== null);
48
+ // Mirror the resolver's ordering: by `order` then authored index (stable).
49
+ return groups
50
+ .sort((a, b) => (a.g.order ?? 0) - (b.g.order ?? 0) || a.i - b.i)
51
+ .map((x) => x.g);
52
+ }
53
+ function normalizeInclude(raw) {
54
+ if (typeof raw === 'string')
55
+ return raw;
56
+ if (raw && typeof raw === 'object' && typeof raw.tag === 'string') {
57
+ return { tag: raw.tag };
58
+ }
59
+ return undefined;
60
+ }
61
+ function normalizePages(raw) {
62
+ if (!Array.isArray(raw))
63
+ return undefined;
64
+ return raw
65
+ .map((n) => {
66
+ if (typeof n === 'string')
67
+ return { literal: n };
68
+ if (n && typeof n === 'object') {
69
+ return {
70
+ doc: typeof n.doc === 'string' ? n.doc : undefined,
71
+ href: typeof n.href === 'string' ? n.href : undefined,
72
+ label: typeof n.label === 'string' ? n.label : undefined,
73
+ badge: typeof n.badge === 'string' ? n.badge : undefined,
74
+ icon: typeof n.icon === 'string' ? n.icon : undefined,
75
+ };
76
+ }
77
+ return null;
78
+ })
79
+ .filter((x) => x !== null);
80
+ }
81
+ function audienceChip(audience) {
82
+ if (audience === 'public') {
83
+ return { icon: _jsx(Globe, { className: "h-3 w-3" }), label: 'Public', tone: 'text-emerald-700 bg-emerald-50 border-emerald-200' };
84
+ }
85
+ if (audience && typeof audience === 'object' && typeof audience.profile === 'string') {
86
+ return { icon: _jsx(Lock, { className: "h-3 w-3" }), label: `Profile: ${audience.profile}`, tone: 'text-amber-800 bg-amber-50 border-amber-200' };
87
+ }
88
+ // 'org' (default) or absent — inherits the package grant.
89
+ return { icon: _jsx(Building2, { className: "h-3 w-3" }), label: 'Org', tone: 'text-muted-foreground bg-muted/40 border-muted' };
90
+ }
91
+ export function BookPreview({ name, draft }) {
92
+ const d = draft;
93
+ const bookName = String(d.name ?? name ?? '').trim();
94
+ const label = String(d.label ?? bookName);
95
+ const description = typeof d.description === 'string' ? d.description : '';
96
+ const slug = typeof d.slug === 'string' ? d.slug : '';
97
+ const groups = React.useMemo(() => normalizeGroups(d.groups), [d.groups]);
98
+ const aud = audienceChip(d.audience);
99
+ if (!bookName) {
100
+ return (_jsx(PreviewShell, { hint: "book", children: _jsx(PreviewEmptyState, { icon: _jsx(BookOpen, { className: "h-8 w-8 opacity-50" }), title: "Name your book", description: "Enter a name in the Form tab to start authoring the documentation spine." }) }));
101
+ }
102
+ // The live-resolved tree (actual docs per group) is server-derived. Offer a
103
+ // link so authors can verify membership against the current doc set.
104
+ const treeUrl = `/meta/book/${encodeURIComponent(bookName)}/tree`;
105
+ return (_jsx(PreviewShell, { hint: "book \u00B7 spine", toolbar: _jsxs("a", { href: treeUrl, target: "_blank", rel: "noreferrer", className: "text-xs text-muted-foreground hover:text-foreground inline-flex items-center gap-1", title: "Open the live-resolved navigation tree (actual docs per group)", children: ["Resolved tree ", _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", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(BookOpen, { className: "h-4 w-4 text-muted-foreground shrink-0" }), _jsx("span", { className: "text-sm font-medium text-foreground truncate", children: label }), _jsxs("span", { className: `ml-auto inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[10px] font-medium ${aud.tone}`, children: [aud.icon, aud.label] })] }), _jsx("div", { className: "text-xs text-muted-foreground font-mono mt-0.5", children: bookName }), slug && (_jsxs("div", { className: "text-xs text-muted-foreground mt-1", children: ["Slug: ", _jsx("code", { className: "font-mono", children: slug })] })), description && _jsx("div", { className: "text-xs text-muted-foreground mt-1.5", children: description })] }), groups.length === 0 ? (_jsx(PreviewEmptyState, { icon: _jsx(FolderTree, { className: "h-8 w-8 opacity-50" }), title: "No groups yet", tone: "warn", description: _jsxs(_Fragment, { children: ["A book needs at least one group in its ", _jsx("code", { children: "groups" }), " spine. Each group derives its members from an ", _jsx("code", { children: "include" }), " rule (a glob like", ' ', _jsx("code", { children: "crm_guide_*" }), " or a ", _jsx("code", { children: '{ tag }' }), ")."] }) })) : (_jsx("div", { className: "space-y-2", children: groups.map((g, i) => (_jsx(GroupCard, { group: g }, `${g.key}-${i}`))) }))] }) }) }));
106
+ }
107
+ function GroupCard({ group }) {
108
+ return (_jsxs("div", { className: "rounded border bg-background", children: [_jsxs("div", { className: "flex items-center gap-2 border-b bg-muted/20 px-3 py-2", children: [_jsx(FolderTree, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }), _jsx("span", { className: "text-xs font-medium text-foreground truncate", children: group.label }), _jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: group.key }), typeof group.order === 'number' && (_jsxs("span", { className: "text-[10px] text-muted-foreground", title: "Order within the book", children: ["#", group.order] })), _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [group.package && (_jsxs("span", { className: "inline-flex items-center gap-1 rounded border px-1.5 py-0.5 text-[10px] text-muted-foreground", title: "Membership rule is scoped to this package", children: [_jsx(Package, { className: "h-3 w-3" }), group.package] })), _jsx(IncludeChip, { include: group.include, hasOverride: !!group.pages?.length })] })] }), _jsx("div", { className: "px-3 py-2", children: group.pages?.length ? (_jsx("ol", { className: "space-y-1", children: group.pages.map((node, i) => (_jsx(PageRow, { node: node }, i))) })) : group.include != null ? (_jsx("div", { className: "text-[11px] text-muted-foreground italic", children: "Members derived from the rule above \u2014 resolved against the live doc set." })) : (_jsxs("div", { className: "text-[11px] text-amber-700 italic", children: ["No ", _jsx("code", { children: "include" }), " rule and no explicit ", _jsx("code", { children: "pages" }), " \u2014 this group matches nothing unless docs set ", _jsxs("code", { children: ["group: \"", group.key, "\""] }), "."] })) })] }));
109
+ }
110
+ function IncludeChip({ include, hasOverride }) {
111
+ if (include == null) {
112
+ return hasOverride ? (_jsx("span", { className: "text-[10px] text-muted-foreground", title: "Curated order via explicit pages", children: "curated" })) : null;
113
+ }
114
+ if (typeof include === 'string') {
115
+ return (_jsx("span", { className: "inline-flex items-center gap-1 rounded border border-primary/30 bg-primary/5 px-1.5 py-0.5 font-mono text-[10px] text-foreground", title: "Glob over doc names", children: include }));
116
+ }
117
+ return (_jsxs("span", { className: "inline-flex items-center gap-1 rounded border border-primary/30 bg-primary/5 px-1.5 py-0.5 text-[10px] text-foreground", title: "Match by doc tag", children: [_jsx(Tag, { className: "h-3 w-3" }), include.tag] }));
118
+ }
119
+ function PageRow({ node }) {
120
+ // Separator (`---`).
121
+ if (node.literal === '---') {
122
+ return (_jsxs("li", { className: "flex items-center gap-2 text-[10px] uppercase tracking-wider text-muted-foreground/60", children: [_jsx(Minus, { className: "h-3 w-3" }), "separator"] }));
123
+ }
124
+ // Rest marker (`...`) — expands to the group's unpinned members at resolve time.
125
+ if (node.literal === '...') {
126
+ return (_jsxs("li", { className: "flex items-center gap-2 text-[11px] italic text-muted-foreground", children: [_jsx(MoreHorizontal, { className: "h-3.5 w-3.5" }), "\u2026rest (remaining matched docs, by order)"] }));
127
+ }
128
+ const isExternal = !!node.href;
129
+ const docName = node.literal ?? node.doc;
130
+ const display = node.label ?? docName ?? node.href ?? '(empty)';
131
+ return (_jsxs("li", { className: "flex items-center gap-2 text-xs", children: [isExternal ? (_jsx(ExternalLink, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" })) : (_jsx(FileText, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" })), _jsx("span", { className: "truncate", children: display }), !isExternal && docName && node.label && (_jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: docName })), node.badge && (_jsx("span", { className: "rounded-full border border-primary/30 bg-primary/5 px-1.5 py-0.5 text-[9px] uppercase tracking-wider text-foreground", children: node.badge })), isExternal && (_jsx("a", { href: node.href, target: "_blank", rel: "noreferrer", onClick: (e) => e.stopPropagation(), className: "ml-auto font-mono text-[10px] text-muted-foreground hover:text-foreground truncate max-w-[40%]", title: node.href, children: node.href }))] }));
132
+ }
@@ -1,2 +1,17 @@
1
+ /**
2
+ * DashboardPreview — interactive design surface for a Dashboard
3
+ * metadata draft. Clicking a widget emits a {@link MetadataSelection}
4
+ * so the host swaps the right-side inspector to that widget's form.
5
+ *
6
+ * Uses the same DashboardRenderer the runtime DashboardView uses, with
7
+ * the adapter from app-shell's AdapterProvider so widgets can query
8
+ * live data. `designMode` is ON whenever the host is editing —
9
+ * read-only / view mode falls back to a plain runtime preview so the
10
+ * canvas looks identical to what end users see.
11
+ *
12
+ * The plugin is loaded lazily to avoid pulling its dep graph into
13
+ * every metadata-admin page load.
14
+ */
15
+ import * as React from 'react';
1
16
  import type { MetadataPreviewProps } from '../preview-registry';
2
- export declare function DashboardPreview({ draft }: MetadataPreviewProps): import("react/jsx-runtime").JSX.Element;
17
+ export declare function DashboardPreview({ draft, editing, onPatch, selection, onSelectionChange, locale, }: MetadataPreviewProps): React.JSX.Element;