@puredesktop/puredesktop-ui-bridge 1.0.0-beta.1

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 (412) hide show
  1. package/package.json +96 -0
  2. package/src/agents/runtime/agentLiveReducer.test.ts +72 -0
  3. package/src/agents/runtime/agentLiveReducer.ts +139 -0
  4. package/src/agents/runtime/agentRunEventTypes.ts +115 -0
  5. package/src/agents/runtime/contextWindowUsage.test.ts +38 -0
  6. package/src/agents/runtime/contextWindowUsage.ts +25 -0
  7. package/src/agents/runtime/index.ts +24 -0
  8. package/src/agents/runtime/mapAgentMessages.ts +54 -0
  9. package/src/agents/runtime/mapAgentSnapshot.ts +71 -0
  10. package/src/agents/runtime/mergeUsageTurn.ts +23 -0
  11. package/src/agents/runtime/pendingToolCalls.test.ts +85 -0
  12. package/src/agents/runtime/pendingToolCalls.ts +14 -0
  13. package/src/agents/runtime/toolRequiresApproval.ts +20 -0
  14. package/src/agents/runtime/unresolvedToolCalls.ts +42 -0
  15. package/src/bridge/agentModelTiers.ts +50 -0
  16. package/src/bridge/agentToolHandlers.ts +23 -0
  17. package/src/bridge/agentToolHelpers.test.ts +27 -0
  18. package/src/bridge/agentToolHelpers.ts +20 -0
  19. package/src/bridge/agentTypes.ts +294 -0
  20. package/src/bridge/agents.d.mts +113 -0
  21. package/src/bridge/agents.mjs +233 -0
  22. package/src/bridge/agents.ts +62 -0
  23. package/src/bridge/appSettings.d.mts +9 -0
  24. package/src/bridge/appSettings.mjs +18 -0
  25. package/src/bridge/appSettings.ts +4 -0
  26. package/src/bridge/applyThemeFromHost.d.mts +7 -0
  27. package/src/bridge/applyThemeFromHost.mjs +33 -0
  28. package/src/bridge/assets.d.mts +66 -0
  29. package/src/bridge/assets.mjs +121 -0
  30. package/src/bridge/catalog.d.mts +5 -0
  31. package/src/bridge/catalog.mjs +24 -0
  32. package/src/bridge/catalog.ts +1 -0
  33. package/src/bridge/client.d.mts +19 -0
  34. package/src/bridge/client.mjs +147 -0
  35. package/src/bridge/collectionAssetAdapter.ts +63 -0
  36. package/src/bridge/collectionAssets.d.mts +1 -0
  37. package/src/bridge/collectionAssets.mjs +2 -0
  38. package/src/bridge/collectionAssets.ts +1 -0
  39. package/src/bridge/collectionDocumentHtml.test.ts +71 -0
  40. package/src/bridge/collectionDocumentHtml.ts +118 -0
  41. package/src/bridge/collectionImagePaste.test.ts +32 -0
  42. package/src/bridge/collectionImagePaste.ts +130 -0
  43. package/src/bridge/context.mjs +12 -0
  44. package/src/bridge/credentials.mjs +22 -0
  45. package/src/bridge/dialog.d.mts +5 -0
  46. package/src/bridge/dialog.mjs +13 -0
  47. package/src/bridge/events.d.mts +14 -0
  48. package/src/bridge/events.mjs +12 -0
  49. package/src/bridge/filePreviewKind.test.ts +43 -0
  50. package/src/bridge/filePreviewKind.ts +76 -0
  51. package/src/bridge/fs.d.mts +41 -0
  52. package/src/bridge/fs.mjs +82 -0
  53. package/src/bridge/fs.test.ts +16 -0
  54. package/src/bridge/fs.ts +10 -0
  55. package/src/bridge/index.ts +12 -0
  56. package/src/bridge/inlinePreview.d.mts +35 -0
  57. package/src/bridge/inlinePreview.mjs +99 -0
  58. package/src/bridge/inlinePreview.test.ts +56 -0
  59. package/src/bridge/inlinePreview.ts +13 -0
  60. package/src/bridge/methods.d.mts +115 -0
  61. package/src/bridge/methods.mjs +132 -0
  62. package/src/bridge/os.d.mts +11 -0
  63. package/src/bridge/os.mjs +26 -0
  64. package/src/bridge/plugins.d.mts +9 -0
  65. package/src/bridge/plugins.mjs +31 -0
  66. package/src/bridge/plugins.ts +5 -0
  67. package/src/bridge/preferences.d.mts +7 -0
  68. package/src/bridge/preferences.mjs +17 -0
  69. package/src/bridge/preferences.ts +13 -0
  70. package/src/bridge/printDocument.test.ts +47 -0
  71. package/src/bridge/printDocument.ts +75 -0
  72. package/src/bridge/pureRender/adapters.test.ts +144 -0
  73. package/src/bridge/pureRender/adapters.ts +175 -0
  74. package/src/bridge/pureRender/assets.test.ts +44 -0
  75. package/src/bridge/pureRender/base.css +76 -0
  76. package/src/bridge/pureRender/compiler.test.ts +279 -0
  77. package/src/bridge/pureRender/compiler.ts +660 -0
  78. package/src/bridge/pureRender/document.test.ts +283 -0
  79. package/src/bridge/pureRender/document.ts +35 -0
  80. package/src/bridge/pureRender/extraction.test.ts +432 -0
  81. package/src/bridge/pureRender/extraction.ts +1023 -0
  82. package/src/bridge/pureRender/flow.css +3 -0
  83. package/src/bridge/pureRender/index.ts +66 -0
  84. package/src/bridge/pureRender/normalize.test.ts +442 -0
  85. package/src/bridge/pureRender/normalize.ts +682 -0
  86. package/src/bridge/pureRender/presets.ts +365 -0
  87. package/src/bridge/pureRender/profiles/book.css +19 -0
  88. package/src/bridge/pureRender/profiles/manuscript.css +11 -0
  89. package/src/bridge/pureRender/profiles/writer.css +10 -0
  90. package/src/bridge/pureRender/reset.css +5 -0
  91. package/src/bridge/pureRender/samples.ts +94 -0
  92. package/src/bridge/pureRender/styles.ts +164 -0
  93. package/src/bridge/pureRender/theme.test.ts +53 -0
  94. package/src/bridge/pureRender/theme.ts +258 -0
  95. package/src/bridge/pureRender/tokens/default.css +36 -0
  96. package/src/bridge/pureRender/tokens/default.json +32 -0
  97. package/src/bridge/pureRender/types.ts +264 -0
  98. package/src/bridge/pureRender/visualLayoutInspection.test.ts +57 -0
  99. package/src/bridge/pureRender/visualLayoutInspection.ts +161 -0
  100. package/src/bridge/react/useDebouncedEffect.ts +21 -0
  101. package/src/bridge/react/useIpc.tsx +75 -0
  102. package/src/bridge/react/usePlatformAgentRunLiveState.tsx +78 -0
  103. package/src/bridge/react/usePlatformAgentSessionDrive.tsx +729 -0
  104. package/src/bridge/react/usePlatformAgentSessions.tsx +60 -0
  105. package/src/bridge/react/usePlatformAgentTools.tsx +82 -0
  106. package/src/bridge/react/usePlatformAppManifest.tsx +32 -0
  107. package/src/bridge/react/usePlatformBridge.tsx +56 -0
  108. package/src/bridge/react/usePlatformDeepLink.tsx +57 -0
  109. package/src/bridge/react/usePlatformFileBinaryDataUrl.tsx +54 -0
  110. package/src/bridge/react/usePlatformFilePreview.tsx +92 -0
  111. package/src/bridge/react/usePlatformPreferences.tsx +77 -0
  112. package/src/bridge/react/usePlatformThemeDocumentAttrs.ts +35 -0
  113. package/src/bridge/react/usePlatformThemeFromBridge.tsx +16 -0
  114. package/src/bridge/react/usePlatformViewportResource.test.tsx +106 -0
  115. package/src/bridge/react/usePlatformViewportResource.tsx +72 -0
  116. package/src/bridge/react/useScheduledTask.tsx +59 -0
  117. package/src/bridge/render.d.mts +31 -0
  118. package/src/bridge/render.mjs +62 -0
  119. package/src/bridge/render.ts +8 -0
  120. package/src/bridge/screenAnnotation.test.ts +103 -0
  121. package/src/bridge/screenAnnotation.ts +269 -0
  122. package/src/bridge/theme.d.mts +3 -0
  123. package/src/bridge/theme.mjs +9 -0
  124. package/src/bridge/types.ts +439 -0
  125. package/src/bridge/watch.d.mts +9 -0
  126. package/src/bridge/watch.mjs +34 -0
  127. package/src/bridge/watch.ts +1 -0
  128. package/src/bridge/window.d.mts +44 -0
  129. package/src/bridge/window.mjs +33 -0
  130. package/src/chrome/index.ts +1 -0
  131. package/src/components/accessibility/AccessibilityReviewDialog.test.tsx +104 -0
  132. package/src/components/accessibility/AccessibilityReviewDialog.tsx +350 -0
  133. package/src/components/accessibility/accessibilityReview.test.ts +101 -0
  134. package/src/components/accessibility/accessibilityReview.ts +639 -0
  135. package/src/components/accessibility/index.ts +16 -0
  136. package/src/components/agent-feedback/ScreenAnnotationAgentDialog.tsx +509 -0
  137. package/src/components/agent-feedback/index.ts +5 -0
  138. package/src/components/agents/AgentComposer.tsx +34 -0
  139. package/src/components/agents/AgentContextUsageBar.tsx +127 -0
  140. package/src/components/agents/AgentDrawerPanel.tsx +82 -0
  141. package/src/components/agents/AgentMarkdown.tsx +12 -0
  142. package/src/components/agents/AgentMessageBubble.tsx +82 -0
  143. package/src/components/agents/AgentMessageList.tsx +47 -0
  144. package/src/components/agents/AgentModelMenu.tsx +55 -0
  145. package/src/components/agents/AgentThinkingBlock.tsx +66 -0
  146. package/src/components/agents/AgentToolApprovalActions.tsx +65 -0
  147. package/src/components/agents/AgentToolCallCard.tsx +26 -0
  148. package/src/components/agents/AgentToolPendingList.tsx +39 -0
  149. package/src/components/agents/AgentToolPendingReview.tsx +118 -0
  150. package/src/components/agents/agentPanelStyles.ts +79 -0
  151. package/src/components/agents/agentTypes.ts +96 -0
  152. package/src/components/agents/formatToolCallArguments.test.ts +16 -0
  153. package/src/components/agents/formatToolCallArguments.ts +9 -0
  154. package/src/components/agents/index.ts +40 -0
  155. package/src/components/assets/AssetLibraryDialog.tsx +5 -0
  156. package/src/components/assets/asset-library/AssetLibraryDialog.tsx +43 -0
  157. package/src/components/assets/asset-library/AssetLibraryWorkspace.tsx +54 -0
  158. package/src/components/assets/asset-library/detail/AssetLibraryDetailActions.tsx +68 -0
  159. package/src/components/assets/asset-library/detail/AssetLibraryDetailHeader.tsx +56 -0
  160. package/src/components/assets/asset-library/detail/AssetLibraryDetailPane.tsx +90 -0
  161. package/src/components/assets/asset-library/detail/AssetLibraryDetailPreview.tsx +67 -0
  162. package/src/components/assets/asset-library/detail/AssetLibraryInlinePreview.tsx +87 -0
  163. package/src/components/assets/asset-library/detail/AssetLibraryInlineSourceField.tsx +29 -0
  164. package/src/components/assets/asset-library/detail/AssetLibraryMetadataFields.tsx +34 -0
  165. package/src/components/assets/asset-library/detail/AssetLibraryUsagePanel.tsx +46 -0
  166. package/src/components/assets/asset-library/detail/AssetLibraryVersionsPanel.tsx +145 -0
  167. package/src/components/assets/asset-library/helpers/assetKind.ts +74 -0
  168. package/src/components/assets/asset-library/helpers.ts +41 -0
  169. package/src/components/assets/asset-library/hooks/useAssetDetailDraft.ts +81 -0
  170. package/src/components/assets/asset-library/hooks/useAssetLibraryDialog.ts +233 -0
  171. package/src/components/assets/asset-library/hooks/useAssetLibraryMutations.ts +266 -0
  172. package/src/components/assets/asset-library/hooks/useAssetLibrarySelectionSync.ts +24 -0
  173. package/src/components/assets/asset-library/hooks/useAssetLibraryVersions.ts +145 -0
  174. package/src/components/assets/asset-library/hooks/useInlineAssetPreview.ts +44 -0
  175. package/src/components/assets/asset-library/index.ts +19 -0
  176. package/src/components/assets/asset-library/layout/assetLibraryLayout.ts +201 -0
  177. package/src/components/assets/asset-library/shared/fieldStyles.ts +62 -0
  178. package/src/components/assets/asset-library/sidebar/AssetLibraryFilterPills.tsx +89 -0
  179. package/src/components/assets/asset-library/sidebar/AssetLibraryList.tsx +91 -0
  180. package/src/components/assets/asset-library/sidebar/AssetLibraryListRow.tsx +99 -0
  181. package/src/components/assets/asset-library/sidebar/AssetLibraryListStatus.tsx +24 -0
  182. package/src/components/assets/asset-library/sidebar/AssetLibrarySidebar.tsx +48 -0
  183. package/src/components/assets/asset-library/sidebar/AssetLibrarySidebarActions.tsx +38 -0
  184. package/src/components/assets/asset-library/sidebar/AssetLibrarySidebarToolbar.tsx +78 -0
  185. package/src/components/assets/asset-library/sidebar/AssetListThumbnail.tsx +86 -0
  186. package/src/components/assets/asset-library/types.ts +128 -0
  187. package/src/components/assets/asset-library/utils/assetLibraryUtils.ts +181 -0
  188. package/src/components/assets/asset-library/utils/pathBasename.ts +5 -0
  189. package/src/components/assets/asset-library/utils/sanitizeUploadFileName.ts +7 -0
  190. package/src/components/assets/asset-library/utils/uploadCollectionAsset.ts +52 -0
  191. package/src/components/chrome/OverlayActionCapsule.test.tsx +82 -0
  192. package/src/components/chrome/OverlayActionCapsule.tsx +90 -0
  193. package/src/components/chrome/PanelTabStrip.tsx +113 -0
  194. package/src/components/chrome/PlatformIcon.tsx +27 -0
  195. package/src/components/chrome/PureAppWordmark.tsx +89 -0
  196. package/src/components/chrome/ShellWindowControls.tsx +51 -0
  197. package/src/components/chrome/ThemeModeButton.tsx +16 -0
  198. package/src/components/chrome/Titlebar.tsx +79 -0
  199. package/src/components/chrome/WorkspaceTabStrip.tsx +300 -0
  200. package/src/components/chrome/index.ts +31 -0
  201. package/src/components/chrome/workspaceTabTypes.ts +29 -0
  202. package/src/components/common/buttons/Button.tsx +241 -0
  203. package/src/components/common/buttons/ChoiceChip.tsx +73 -0
  204. package/src/components/common/buttons/CleanButton.tsx +34 -0
  205. package/src/components/common/buttons/IconButton.tsx +89 -0
  206. package/src/components/common/buttons/QuietAction.tsx +29 -0
  207. package/src/components/common/buttons/SegmentedControl.tsx +67 -0
  208. package/src/components/common/buttons/TextActionButton.tsx +55 -0
  209. package/src/components/common/buttons/TextLink.tsx +38 -0
  210. package/src/components/common/canvas/CanvasElementFrame.test.tsx +79 -0
  211. package/src/components/common/canvas/CanvasElementFrame.tsx +182 -0
  212. package/src/components/common/canvas/canvasGeometry.test.ts +66 -0
  213. package/src/components/common/canvas/canvasGeometry.ts +133 -0
  214. package/src/components/common/canvas/index.ts +27 -0
  215. package/src/components/common/canvas/useCanvasDragResize.test.tsx +152 -0
  216. package/src/components/common/canvas/useCanvasDragResize.ts +161 -0
  217. package/src/components/common/chat/ChatAssistantMessage.tsx +81 -0
  218. package/src/components/common/chat/ChatBox.tsx +189 -0
  219. package/src/components/common/chat/ChatMarkdown.tsx +109 -0
  220. package/src/components/common/chat/ChatModelMenu.tsx +258 -0
  221. package/src/components/common/chat/ChatStatusRow.tsx +24 -0
  222. package/src/components/common/chat/ChatThinkingIndicator.tsx +54 -0
  223. package/src/components/common/chat/ChatThread.tsx +59 -0
  224. package/src/components/common/chat/ChatToolRow.tsx +141 -0
  225. package/src/components/common/chat/ChatUserBubble.tsx +45 -0
  226. package/src/components/common/chat/chatUtils.ts +7 -0
  227. package/src/components/common/chat/index.ts +24 -0
  228. package/src/components/common/connections/ConnectionSetup.tsx +529 -0
  229. package/src/components/common/connections/index.ts +26 -0
  230. package/src/components/common/containers/AppFrame.test.tsx +47 -0
  231. package/src/components/common/containers/AppFrame.tsx +65 -0
  232. package/src/components/common/containers/AppHeader.tsx +60 -0
  233. package/src/components/common/containers/AutoFillGrid.tsx +37 -0
  234. package/src/components/common/containers/Collapsible.tsx +43 -0
  235. package/src/components/common/containers/CollapsibleGrid.tsx +174 -0
  236. package/src/components/common/containers/MotionScope.tsx +32 -0
  237. package/src/components/common/containers/PageHeader.tsx +35 -0
  238. package/src/components/common/containers/PanelToolbarHeader.tsx +113 -0
  239. package/src/components/common/containers/QuietDisclosure.tsx +91 -0
  240. package/src/components/common/containers/QuietSurface.tsx +41 -0
  241. package/src/components/common/containers/ScrollPanel.tsx +33 -0
  242. package/src/components/common/containers/StatusBar.tsx +42 -0
  243. package/src/components/common/containers/SurfacePanel.tsx +66 -0
  244. package/src/components/common/containers/ToolbarStrip.tsx +80 -0
  245. package/src/components/common/containers/flex.ts +117 -0
  246. package/src/components/common/containers/useOpenTransition.ts +33 -0
  247. package/src/components/common/context/ContextSelector.tsx +269 -0
  248. package/src/components/common/context/index.ts +7 -0
  249. package/src/components/common/desk/ActionReader.tsx +270 -0
  250. package/src/components/common/desk/ActivityLedger.tsx +143 -0
  251. package/src/components/common/desk/CreationDesk.tsx +139 -0
  252. package/src/components/common/desk/DailyBrief.tsx +160 -0
  253. package/src/components/common/desk/DeskCard.tsx +157 -0
  254. package/src/components/common/desk/index.ts +30 -0
  255. package/src/components/common/dropdown/ContextMenu.tsx +87 -0
  256. package/src/components/common/dropdown/MenuButtonDropdown.tsx +121 -0
  257. package/src/components/common/dropdown/MenuDropdown.tsx +63 -0
  258. package/src/components/common/dropdown/MenuDropdownEntry.tsx +51 -0
  259. package/src/components/common/dropdown/MenuDropdownItem.tsx +82 -0
  260. package/src/components/common/dropdown/MenuDropdownSubmenu.tsx +145 -0
  261. package/src/components/common/dropdown/MenuPanel.tsx +69 -0
  262. package/src/components/common/dropdown/MenuPortal.tsx +162 -0
  263. package/src/components/common/dropdown/MenuPortalLayer.tsx +6 -0
  264. package/src/components/common/dropdown/SelectMenu.tsx +243 -0
  265. package/src/components/common/dropdown/SelectMenuControl.tsx +23 -0
  266. package/src/components/common/dropdown/SelectMenuOptions.tsx +38 -0
  267. package/src/components/common/dropdown/menuPortalConstants.ts +11 -0
  268. package/src/components/common/dropdown/menuTypes.ts +71 -0
  269. package/src/components/common/dropdown/menuViewportPosition.test.ts +139 -0
  270. package/src/components/common/dropdown/menuViewportPosition.ts +122 -0
  271. package/src/components/common/dropdown/selectMenuLayout.test.ts +42 -0
  272. package/src/components/common/dropdown/selectMenuLayout.ts +123 -0
  273. package/src/components/common/dropdown/useMenuAnchorPosition.ts +109 -0
  274. package/src/components/common/dropdown/useSelectMenuAnchor.ts +30 -0
  275. package/src/components/common/evidence/StructuredEvidenceView.test.tsx +77 -0
  276. package/src/components/common/evidence/StructuredEvidenceView.tsx +312 -0
  277. package/src/components/common/evidence/index.ts +13 -0
  278. package/src/components/common/feedback/Badge.tsx +33 -0
  279. package/src/components/common/feedback/CapabilityPills.tsx +36 -0
  280. package/src/components/common/feedback/EmptyState.tsx +132 -0
  281. package/src/components/common/feedback/InfoHint.tsx +67 -0
  282. package/src/components/common/feedback/InlineBanner.tsx +82 -0
  283. package/src/components/common/feedback/PlatformChip.tsx +104 -0
  284. package/src/components/common/feedback/QuietPill.tsx +75 -0
  285. package/src/components/common/feedback/WorkProgressPanel.tsx +156 -0
  286. package/src/components/common/feedback/index.ts +33 -0
  287. package/src/components/common/inputs/BareInput.tsx +31 -0
  288. package/src/components/common/inputs/BareTextarea.tsx +10 -0
  289. package/src/components/common/inputs/Checkbox.tsx +13 -0
  290. package/src/components/common/inputs/FieldControlShell.tsx +49 -0
  291. package/src/components/common/inputs/FormField.tsx +40 -0
  292. package/src/components/common/inputs/HybridSearchField.tsx +280 -0
  293. package/src/components/common/inputs/InlineComposer.tsx +197 -0
  294. package/src/components/common/inputs/PaletteCirclePicker.tsx +26 -0
  295. package/src/components/common/inputs/PaletteDropdown.tsx +413 -0
  296. package/src/components/common/inputs/Radio.tsx +19 -0
  297. package/src/components/common/inputs/SearchField.tsx +128 -0
  298. package/src/components/common/inputs/SelectField.tsx +169 -0
  299. package/src/components/common/inputs/SurfacePalettePicker.tsx +54 -0
  300. package/src/components/common/inputs/TextAreaField.tsx +22 -0
  301. package/src/components/common/inputs/TextField.tsx +51 -0
  302. package/src/components/common/inputs/ToggleSwitch.tsx +110 -0
  303. package/src/components/common/inputs/WorkspacePicker.tsx +349 -0
  304. package/src/components/common/inputs/fieldStyles.ts +137 -0
  305. package/src/components/common/layout/PanelGroup.tsx +479 -0
  306. package/src/components/common/layout/index.ts +31 -0
  307. package/src/components/common/layout/panelLayoutConstants.ts +7 -0
  308. package/src/components/common/layout/panelLayoutPersistence.ts +35 -0
  309. package/src/components/common/layout/panelLayoutState.test.ts +38 -0
  310. package/src/components/common/layout/panelLayoutState.ts +174 -0
  311. package/src/components/common/layout/panelLayoutTypes.ts +19 -0
  312. package/src/components/common/layout/tabs/Tabs.tsx +136 -0
  313. package/src/components/common/lists/listRowStyles.ts +32 -0
  314. package/src/components/common/lists/quiet-ledger/QuietActivityList.tsx +64 -0
  315. package/src/components/common/lists/quiet-ledger/QuietLedgerRow.tsx +119 -0
  316. package/src/components/common/lists/quiet-ledger/index.ts +9 -0
  317. package/src/components/common/lists/reorderable/DragHandle.tsx +65 -0
  318. package/src/components/common/lists/reorderable/ReorderableList.tsx +280 -0
  319. package/src/components/common/lists/reorderable/ReorderableListRow.tsx +102 -0
  320. package/src/components/common/lists/reorderable/ReorderableSections.tsx +344 -0
  321. package/src/components/common/lists/reorderable/ReorderableSectionsDemo.tsx +94 -0
  322. package/src/components/common/lists/reorderable/index.ts +15 -0
  323. package/src/components/common/lists/reorderable/reorderableUtils.test.ts +28 -0
  324. package/src/components/common/lists/reorderable/reorderableUtils.ts +23 -0
  325. package/src/components/common/lists/reorderable/types.ts +40 -0
  326. package/src/components/common/lists/reorderable/useReorderableDragState.ts +49 -0
  327. package/src/components/common/media/ImageReferencePicker.tsx +242 -0
  328. package/src/components/common/menubar/MenuBar.tsx +78 -0
  329. package/src/components/common/menubar/MenuBarTrigger.tsx +70 -0
  330. package/src/components/common/narrative/NarrativeMention.tsx +74 -0
  331. package/src/components/common/navigation/PathBreadcrumbs.tsx +78 -0
  332. package/src/components/common/navigation/UnderlineTabs.tsx +83 -0
  333. package/src/components/common/overlays/InstallAppPromptDialog.tsx +59 -0
  334. package/src/components/common/overlays/Modal.tsx +285 -0
  335. package/src/components/common/overlays/ModalChromeHeader.tsx +105 -0
  336. package/src/components/common/overlays/ObjectActionStrip.tsx +80 -0
  337. package/src/components/common/people/AutoUpdateReviewList.tsx +182 -0
  338. package/src/components/common/people/EntityList.tsx +122 -0
  339. package/src/components/common/people/EntityPortrait.tsx +64 -0
  340. package/src/components/common/people/LinkedDossierList.tsx +99 -0
  341. package/src/components/common/people/OpportunityList.tsx +94 -0
  342. package/src/components/common/people/PeopleSourceList.tsx +145 -0
  343. package/src/components/common/people/RelationshipDossier.tsx +168 -0
  344. package/src/components/common/people/RelationshipMap.tsx +362 -0
  345. package/src/components/common/people/index.ts +40 -0
  346. package/src/components/common/preview/FileAudioPreview.tsx +89 -0
  347. package/src/components/common/preview/FileImagePreview.tsx +88 -0
  348. package/src/components/common/preview/FilePdfPreview.tsx +87 -0
  349. package/src/components/common/preview/FileTextPreview.tsx +96 -0
  350. package/src/components/common/preview/FileVideoPreview.tsx +87 -0
  351. package/src/components/common/preview/PlatformFilePreview.tsx +166 -0
  352. package/src/components/common/preview/previewLayout.ts +27 -0
  353. package/src/components/common/render/Each.tsx +42 -0
  354. package/src/components/common/research/EvidenceDossier.tsx +894 -0
  355. package/src/components/common/research/index.ts +7 -0
  356. package/src/components/common/tiles/CatalogCard.tsx +116 -0
  357. package/src/components/common/tiles/Tile.tsx +45 -0
  358. package/src/components/common/tiles/TileGrid.tsx +13 -0
  359. package/src/components/common/typography/Heading.tsx +27 -0
  360. package/src/components/common/typography/Kicker.tsx +30 -0
  361. package/src/components/common/typography/Text.tsx +80 -0
  362. package/src/components/credentials/CredentialsPanel.tsx +169 -0
  363. package/src/components/credentials/credentialsTypes.ts +14 -0
  364. package/src/components/data/DataChart.tsx +913 -0
  365. package/src/components/data/dataTable.ts +99 -0
  366. package/src/components/editor/EditorCommentPromptDialog.tsx +124 -0
  367. package/src/components/editor/EditorLinkPromptDialog.tsx +65 -0
  368. package/src/components/print-design/PrintDesignPanel.test.tsx +1446 -0
  369. package/src/components/print-design/PrintDesignPanel.tsx +3043 -0
  370. package/src/components/print-design/index.ts +9 -0
  371. package/src/components/proofing/PagedProofDialog.tsx +453 -0
  372. package/src/components/proofing/index.ts +4 -0
  373. package/src/editor/DocumentEditor.tsx +28 -0
  374. package/src/editor/EditorViewModeToggle.tsx +35 -0
  375. package/src/editor/index.ts +97 -0
  376. package/src/editor/toolbarOverlays.ts +8 -0
  377. package/src/index.ts +209 -0
  378. package/src/theme/ThemeProvider.tsx +113 -0
  379. package/src/theme/appAccents.ts +87 -0
  380. package/src/theme/buildThemeBridgePayload.ts +23 -0
  381. package/src/theme/composePlatformTheme.test.ts +30 -0
  382. package/src/theme/composePlatformTheme.ts +23 -0
  383. package/src/theme/platformFont.d.mts +7 -0
  384. package/src/theme/platformFont.mjs +20 -0
  385. package/src/theme/platformFont.ts +6 -0
  386. package/src/theme/reportsShellChromeSelectors.ts +136 -0
  387. package/src/theme/styled.d.ts +5 -0
  388. package/src/theme/surfacePalettes.ts +178 -0
  389. package/src/theme/surfaceRoleSelectors.ts +113 -0
  390. package/src/theme/themeVars.ts +13 -0
  391. package/src/theme/themes/dark.ts +59 -0
  392. package/src/theme/themes/light.ts +60 -0
  393. package/src/theme/themes/palette.ts +44 -0
  394. package/src/theme/themes/shared.ts +68 -0
  395. package/src/theme/tokens.ts +114 -0
  396. package/src/theme/utils/GlobalStyles.ts +88 -0
  397. package/src/theme/utils/appFrameDocumentStyles.d.mts +5 -0
  398. package/src/theme/utils/appFrameDocumentStyles.mjs +89 -0
  399. package/src/theme/utils/appFrameDocumentStyles.ts +5 -0
  400. package/src/theme/utils/applyTheme.ts +50 -0
  401. package/src/theme/utils/cssVariables.ts +49 -0
  402. package/src/theme/utils/useInjectThemeIntoIframe.ts +40 -0
  403. package/src/utils/extensionIconMap.ts +123 -0
  404. package/src/utils/generalUtils.ts +157 -0
  405. package/src/writing/DraftAssistantDialog.tsx +279 -0
  406. package/src/writing/WritingStyleManager.tsx +416 -0
  407. package/src/writing/condenseWritingStyle.ts +103 -0
  408. package/src/writing/draftTextWithAgent.ts +134 -0
  409. package/src/writing/index.ts +39 -0
  410. package/src/writing/styleStore.ts +32 -0
  411. package/src/writing/writingStyle.test.ts +122 -0
  412. package/src/writing/writingStyle.ts +217 -0
@@ -0,0 +1,439 @@
1
+ export type PlatformBridgeEventName =
2
+ import('./events.mjs').PlatformBridgeEventName
3
+
4
+ import type { PlatformThemeMode } from '../theme/tokens.js'
5
+
6
+ /** Shell prefs exposed via `settings.prefs.get` / `settings.prefs.set`. */
7
+ export type PlatformThemePreference = PlatformThemeMode
8
+
9
+ export interface PlatformShellPreferences {
10
+ workingDirectory: string
11
+ theme: PlatformThemePreference
12
+ appSettings?: Record<string, Record<string, unknown>>
13
+ /** Local agent models enabled in the shell model menu. */
14
+ enabledLocalLlmModelIds?: string[]
15
+ /** Low / high agent model tiers from shell settings. */
16
+ agentModelTiers?: {
17
+ lowLevelModelId: string
18
+ highLevelModelId: string
19
+ }
20
+ /** Defaults for new agent sessions per scope. */
21
+ agentSessionDefaults?: {
22
+ global?: Record<string, unknown>
23
+ apps?: Record<string, Record<string, unknown>>
24
+ }
25
+ /** Explicit opt-in switches for unfinished capabilities. */
26
+ betaFeatures?: {
27
+ /** Enables model-backed Pure Render reference-image extraction in app panels. */
28
+ pureRenderVisionExtraction?: boolean
29
+ }
30
+ /**
31
+ * Host-only workspace tab session (phase 4). Plugin apps should ignore this field.
32
+ */
33
+ platformWorkspace?: Record<string, unknown>
34
+ }
35
+
36
+ export interface PlatformAppSettingsUpdateRequest {
37
+ appSlug: string
38
+ patch: Record<string, unknown>
39
+ }
40
+
41
+ export interface PlatformThemeBridgePayload {
42
+ mode: PlatformThemeMode
43
+ /** Active surface palette id, omitted when platform default. */
44
+ surfacePaletteId?: string | null
45
+ css: string
46
+ }
47
+
48
+ export type PlatformFileKind =
49
+ | 'folder'
50
+ | 'image'
51
+ | 'video'
52
+ | 'audio'
53
+ | 'pdf'
54
+ | 'code'
55
+ | 'html'
56
+ | 'markdown'
57
+ | 'spreadsheet'
58
+ | 'data'
59
+ | 'text'
60
+ | 'other'
61
+
62
+ /** Mirrors `PlatformAppManifest` from the shell contracts. */
63
+ export interface PlatformAppManifest {
64
+ id: string
65
+ slug: string
66
+ name: string
67
+ navigationLabel?: string
68
+ productName: string
69
+ kind: string
70
+ description: string
71
+ peopleProviders?: Array<{
72
+ id: string
73
+ label: string
74
+ storage: {
75
+ fileName: string
76
+ contactPaths: Array<{
77
+ path: string
78
+ nameField?: string
79
+ emailField?: string
80
+ }>
81
+ }
82
+ }>
83
+ icon?: string
84
+ source?: 'builtin' | 'plugin'
85
+ pluginId?: string
86
+ pluginRoot?: string
87
+ }
88
+
89
+ export interface PlatformPeopleSuggestRequest {
90
+ query: string
91
+ limit?: number
92
+ }
93
+
94
+ export interface PlatformPeopleSuggestion {
95
+ name: string
96
+ email?: string
97
+ sourceAppSlug: string
98
+ sourceLabel: string
99
+ providerId: string
100
+ }
101
+
102
+ /** Mirrors `PlatformShellManifest` from the shell contracts. */
103
+ export interface PlatformShellManifest {
104
+ apps: PlatformAppManifest[]
105
+ }
106
+
107
+ /**
108
+ * Binds one plugin iframe to a shell workspace tab (phase 4+).
109
+ * `resource` is the document/file this tab owns; `null` for app-only tabs.
110
+ */
111
+ export interface PlatformBridgeViewportBinding {
112
+ tabId: string
113
+ resource: ResourceOpenEvent | null
114
+ }
115
+
116
+ export interface PlatformBridgeReadyMeta {
117
+ version: number
118
+ pluginId: string
119
+ appSlug: string
120
+ methods: string[]
121
+ theme?: PlatformThemeBridgePayload
122
+ /** Per-tab open intent — apps should prefer this over global consume queues. */
123
+ viewport?: PlatformBridgeViewportBinding
124
+ }
125
+
126
+ export interface ResourceOpenEvent {
127
+ path: string
128
+ name?: string
129
+ kind?: PlatformFileKind
130
+ sourceAppSlug?: string
131
+ }
132
+
133
+ export type RenderProgressPhase =
134
+ | 'loading'
135
+ | 'paginating'
136
+ | 'printing'
137
+ | 'done'
138
+ | 'error'
139
+
140
+ export interface RenderProgress {
141
+ phase: RenderProgressPhase
142
+ pct?: number
143
+ message?: string
144
+ outputPath?: string
145
+ hint?: string
146
+ sourcePath?: string
147
+ }
148
+
149
+ export interface RenderPrintHtmlRequest {
150
+ htmlPath: string
151
+ outputPath: string
152
+ basePath?: string
153
+ pageSize?: string
154
+ margins?: string
155
+ loadingMessage?: string
156
+ }
157
+
158
+ export interface RenderPagedPreviewRequest {
159
+ htmlPath: string
160
+ basePath?: string
161
+ loadingMessage?: string
162
+ }
163
+
164
+ export interface RenderPagedSnapshotRequest {
165
+ htmlPath: string
166
+ outputPath: string
167
+ basePath?: string
168
+ page?: number
169
+ loadingMessage?: string
170
+ }
171
+
172
+ export interface RenderPagedSnapshotResult {
173
+ imagePath: string
174
+ page: number
175
+ pageCount: number
176
+ metrics?: RenderPagedSnapshotMetrics
177
+ }
178
+
179
+ export interface RenderPagedSnapshotMetrics {
180
+ topGapRatio: number
181
+ bottomGapRatio: number
182
+ usedHeightRatio: number
183
+ pageCount?: number
184
+ problemPage?: number
185
+ figurePage?: number
186
+ imagePage?: number
187
+ captionPage?: number
188
+ headingPage?: number
189
+ blankBeforeFigurePx?: number
190
+ blankBeforeFigureRatio?: number
191
+ blankPageCount?: number
192
+ imageVisible?: boolean
193
+ captionVisible?: boolean
194
+ captionOrphaned?: boolean
195
+ strandedHeading?: boolean | null
196
+ }
197
+
198
+ export interface RenderPagedPreviewResult {
199
+ htmlPath: string
200
+ html: string
201
+ pageCount: number
202
+ }
203
+
204
+ /** Built-in trade-book page sizes (`render.getPrintStylesheet`). */
205
+ export type PrintPageSize = 'A4' | 'A5' | '6x9'
206
+
207
+ export type FileWatchChangeType = 'add' | 'change' | 'unlink'
208
+
209
+ export interface FileWatchChange {
210
+ path: string
211
+ relativePath: string
212
+ type: FileWatchChangeType
213
+ }
214
+
215
+ /** Plugin bridge `watch.change` payload. */
216
+ export interface WatchChangeEvent extends FileWatchChange {
217
+ rootPath: string
218
+ }
219
+
220
+ /**
221
+ * Result of `catalog.consumePendingOpen` — open intent for **this viewport tab only**.
222
+ * Prefer `PlatformBridgeReadyMeta.viewport.resource` on boot when available.
223
+ */
224
+ export interface PlatformCatalogConsumePendingOpenResult {
225
+ resource: ResourceOpenEvent | null
226
+ }
227
+
228
+ export interface PlatformPluginInstallRequest {
229
+ path: string
230
+ }
231
+
232
+ export interface PlatformPluginInstallSummary {
233
+ id: string
234
+ name: string
235
+ rootDir: string
236
+ }
237
+
238
+ export interface PlatformPluginInstallResult {
239
+ installed: boolean
240
+ sourcePath: string
241
+ targetPath: string
242
+ plugin: PlatformPluginInstallSummary
243
+ }
244
+
245
+ /** Minimal manifest fields for install / create gating in plugin apps. */
246
+ export interface PlatformAppInstallState {
247
+ pluginRoot?: string
248
+ }
249
+
250
+ export interface PlatformFileReadPreviewResult {
251
+ path: string
252
+ content: string | null
253
+ truncated: boolean
254
+ encoding: 'utf-8'
255
+ }
256
+
257
+ export interface PlatformFileReadBinaryResult {
258
+ path: string
259
+ mimeType: string
260
+ base64: string
261
+ truncated: boolean
262
+ byteLength: number
263
+ }
264
+
265
+ export interface PlatformFilePreviewUrlResult {
266
+ path: string
267
+ url: string
268
+ mimeType: string
269
+ byteLength: number
270
+ }
271
+
272
+ /** Minimal file entry fields required for inline preview in plugin iframes. */
273
+ export interface PlatformFilePreviewEntry {
274
+ path: string
275
+ name: string
276
+ extension: string
277
+ kind: PlatformFileKind
278
+ isDirectory: boolean
279
+ }
280
+
281
+ /** Collection asset index — shell `assets.*`; apps pass `collectionPath`. */
282
+ export type PlatformAssetKind =
283
+ | 'image'
284
+ | 'vector'
285
+ | 'mermaid'
286
+ | 'table'
287
+ | 'math'
288
+ | 'other'
289
+
290
+ export type PlatformAssetOrigin =
291
+ | 'uploaded'
292
+ | 'imported'
293
+ | 'generated'
294
+ | 'derived'
295
+
296
+ export type PlatformAssetSourceType =
297
+ | 'file'
298
+ | 'inline-mermaid'
299
+ | 'inline-table'
300
+ | 'inline-math'
301
+
302
+ export interface PlatformAssetUsage {
303
+ documentPath: string
304
+ title: string
305
+ }
306
+
307
+ export interface PlatformAssetSummary {
308
+ id: string
309
+ collectionPath: string
310
+ relativePath: string
311
+ absolutePath: string
312
+ fileName: string
313
+ label: string
314
+ caption?: string
315
+ description?: string
316
+ kind: PlatformAssetKind
317
+ mimeType: string
318
+ byteLength: number
319
+ modifiedAt: string
320
+ usedIn: PlatformAssetUsage[]
321
+ lineageId: string
322
+ versionNumber: number
323
+ parentRelativePath?: string
324
+ origin?: PlatformAssetOrigin
325
+ transformationPrompt?: string
326
+ createdBy?: string
327
+ sourceType?: PlatformAssetSourceType
328
+ sourceCode?: string
329
+ sourceDocumentPath?: string
330
+ sourceAppSlug?: string
331
+ sourceNodeId?: string
332
+ }
333
+
334
+ export interface PlatformAssetContext {
335
+ asset: PlatformAssetSummary
336
+ versions: PlatformAssetSummary[]
337
+ isLatestVersion: boolean
338
+ latestVersionRelativePath: string
339
+ totalVersions: number
340
+ }
341
+
342
+ export interface PlatformAssetListScopedRequest {
343
+ collectionPath: string
344
+ /** Relative paths under `collectionPath` — supplied by the active app. */
345
+ documentFiles: string[]
346
+ }
347
+
348
+ export interface PlatformAssetDeleteRequest {
349
+ collectionPath: string
350
+ relativePath: string
351
+ }
352
+
353
+ export interface PlatformAssetUpdateRequest {
354
+ collectionPath: string
355
+ relativePath: string
356
+ label?: string
357
+ caption?: string
358
+ description?: string
359
+ sourceDocumentPath?: string
360
+ sourceAppSlug?: string
361
+ }
362
+
363
+ export interface PlatformAssetSourceUpdateRequest
364
+ extends PlatformAssetUpdateRequest {
365
+ assetId: string
366
+ kind: 'mermaid' | 'table' | 'math'
367
+ sourceCode: string
368
+ }
369
+
370
+ export interface PlatformAssetSourceUpdateScopedRequest
371
+ extends PlatformAssetSourceUpdateRequest {
372
+ /** Relative paths under `collectionPath` — supplied by the active app. */
373
+ documentFiles: string[]
374
+ }
375
+
376
+ export interface PlatformAssetSelection {
377
+ collectionPath: string
378
+ relativePath: string
379
+ }
380
+
381
+ export interface PlatformAssetVersionCreateRequest {
382
+ collectionPath: string
383
+ sourceRelativePath: string
384
+ sourcePath: string
385
+ label?: string
386
+ caption?: string
387
+ description?: string
388
+ transformationPrompt?: string
389
+ createdBy?: string
390
+ }
391
+
392
+ export interface PlatformAssetReferenceSwapRequest {
393
+ collectionPath: string
394
+ fromRelativePath: string
395
+ toRelativePath: string
396
+ scope: 'document' | 'collection'
397
+ documentFile?: string
398
+ }
399
+
400
+ export interface PlatformAssetReferenceSwapScopedRequest
401
+ extends PlatformAssetReferenceSwapRequest {
402
+ /** Relative paths under `collectionPath` — supplied by the active app. */
403
+ documentFiles: string[]
404
+ }
405
+
406
+ export interface PlatformAssetReferenceSwapResult {
407
+ updatedDocuments: number
408
+ updatedReferences: number
409
+ }
410
+
411
+ export interface PlatformAssetTransformRequest {
412
+ collectionPath?: string
413
+ sourceRelativePath?: string
414
+ prompt: string
415
+ label?: string
416
+ createdBy?: string
417
+ }
418
+
419
+ export interface PlatformAssetGetContextRequest {
420
+ collectionPath: string
421
+ relativePath: string
422
+ }
423
+
424
+ export type PlatformBridgeEventHandler = (payload: unknown) => void
425
+
426
+ export interface PlatformBridgeClient {
427
+ waitForReady(): Promise<PlatformBridgeReadyMeta>
428
+ call<T = unknown>(method: string, args?: unknown[]): Promise<T>
429
+ onEvent(
430
+ name: PlatformBridgeEventName | string,
431
+ handler: PlatformBridgeEventHandler,
432
+ ): () => void
433
+ offEvent(
434
+ name: PlatformBridgeEventName | string,
435
+ handler: PlatformBridgeEventHandler,
436
+ ): void
437
+ getMethods(): string[]
438
+ ping(): Promise<unknown>
439
+ }
@@ -0,0 +1,9 @@
1
+ import type { WatchChangeEvent } from './types.js'
2
+
3
+ export function watchStart(rootPath: string): Promise<void>
4
+
5
+ export function watchStop(rootPath: string): Promise<void>
6
+
7
+ export function onWatchChange(
8
+ listener: (payload: WatchChangeEvent) => void,
9
+ ): () => void
@@ -0,0 +1,34 @@
1
+ import { bridge } from './client.mjs'
2
+ import { PLATFORM_BRIDGE_EVENTS } from './events.mjs'
3
+ import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
4
+
5
+ /**
6
+ * Start watching a directory for debounced filesystem events.
7
+ * Requires `filesystem` permission.
8
+ *
9
+ * @param {string} rootPath Absolute path to watch
10
+ * @returns {Promise<void>}
11
+ */
12
+ export async function watchStart(rootPath) {
13
+ return bridge.call(PLATFORM_BRIDGE_METHODS.WATCH_START, [rootPath])
14
+ }
15
+
16
+ /**
17
+ * Stop watching a directory for this plugin tab.
18
+ *
19
+ * @param {string} rootPath Same absolute path passed to watchStart
20
+ * @returns {Promise<void>}
21
+ */
22
+ export async function watchStop(rootPath) {
23
+ return bridge.call(PLATFORM_BRIDGE_METHODS.WATCH_STOP, [rootPath])
24
+ }
25
+
26
+ /**
27
+ * Subscribe to watch.change events for paths this tab is watching.
28
+ *
29
+ * @param {(payload: import('./types.js').WatchChangeEvent) => void} listener
30
+ * @returns {() => void} unsubscribe
31
+ */
32
+ export function onWatchChange(listener) {
33
+ return bridge.onEvent(PLATFORM_BRIDGE_EVENTS.WATCH_CHANGE, listener)
34
+ }
@@ -0,0 +1 @@
1
+ export { onWatchChange, watchStart, watchStop } from './watch.mjs'
@@ -0,0 +1,44 @@
1
+ export type PlatformScreenCaptureMode = 'content' | 'ui'
2
+
3
+ export interface PlatformScreenCaptureRect {
4
+ x: number
5
+ y: number
6
+ width: number
7
+ height: number
8
+ }
9
+
10
+ export interface PlatformScreenCaptureOptionChoice {
11
+ value: string
12
+ label: string
13
+ }
14
+
15
+ /** A contextual control the overlay renders (e.g. design scope: this/all). */
16
+ export interface PlatformScreenCaptureOption {
17
+ id: string
18
+ label: string
19
+ type: 'toggle' | 'choice'
20
+ choices?: PlatformScreenCaptureOptionChoice[]
21
+ default?: string | boolean
22
+ }
23
+
24
+ export type PlatformScreenCaptureOptionValues = Record<string, string | boolean>
25
+
26
+ export interface PlatformScreenCaptureResult {
27
+ /** PNG data URL of the cropped region with the drawn marks composited in. */
28
+ imageDataUrl: string
29
+ /** Selection rect — app-local px in content mode, window px in vibe mode. */
30
+ rect: PlatformScreenCaptureRect
31
+ note: string
32
+ mode: PlatformScreenCaptureMode
33
+ /** True when the user drew pen marks — the agent should focus on them. */
34
+ hasMarks: boolean
35
+ /** Selected values for the contextual option controls, keyed by option id. */
36
+ optionValues: PlatformScreenCaptureOptionValues
37
+ }
38
+
39
+ export declare function startScreenCapture(options?: {
40
+ label?: string
41
+ options?: PlatformScreenCaptureOption[]
42
+ }): Promise<PlatformScreenCaptureResult | null>
43
+
44
+ export declare function onScreenCaptureShortcut(listener: () => void): () => void
@@ -0,0 +1,33 @@
1
+ import { bridge } from './client.mjs'
2
+ import { PLATFORM_BRIDGE_EVENTS } from './events.mjs'
3
+ import { PLATFORM_BRIDGE_METHODS } from './methods.mjs'
4
+
5
+ /**
6
+ * Start the shell's chromeless screen-capture overlay. The user drags a region,
7
+ * draws marks, and adds a note; resolves with the cropped annotated image plus
8
+ * the selection rect (app-local px in content mode, window px in vibe mode), or
9
+ * null if cancelled. Requires `agents` permission.
10
+ *
11
+ * @param {{ label?: string, options?: import('./window.d.mts').PlatformScreenCaptureOption[] }} [options]
12
+ * `label` states what the capture transforms (e.g. "book content", "page
13
+ * design"); `options` are contextual controls rendered in the overlay.
14
+ * @returns {Promise<import('./window.d.mts').PlatformScreenCaptureResult | null>}
15
+ */
16
+ export async function startScreenCapture(options = {}) {
17
+ return bridge.call(PLATFORM_BRIDGE_METHODS.WINDOW_START_SCREEN_CAPTURE, [
18
+ { label: options.label, options: options.options },
19
+ ])
20
+ }
21
+
22
+ /**
23
+ * Subscribe to the window-wide camera shortcut (Cmd/Ctrl+Shift+X), forwarded to
24
+ * the active app. Apps typically respond by opening their default capture.
25
+ *
26
+ * @param {() => void} listener
27
+ * @returns {() => void} unsubscribe
28
+ */
29
+ export function onScreenCaptureShortcut(listener) {
30
+ return bridge.onEvent(PLATFORM_BRIDGE_EVENTS.WINDOW_CAMERA_SHORTCUT, () => {
31
+ listener()
32
+ })
33
+ }
@@ -0,0 +1 @@
1
+ export * from '../components/chrome/index.js'
@@ -0,0 +1,104 @@
1
+ import { act } from 'react'
2
+ import { createRoot, type Root } from 'react-dom/client'
3
+ import { afterEach, describe, expect, it, vi } from 'vitest'
4
+ import { AccessibilityReviewDialog } from './AccessibilityReviewDialog.js'
5
+
6
+ function render(ui: React.ReactElement): {
7
+ container: HTMLDivElement
8
+ root: Root
9
+ } {
10
+ const container = document.createElement('div')
11
+ document.body.appendChild(container)
12
+ const root = createRoot(container)
13
+ act(() => {
14
+ root.render(ui)
15
+ })
16
+ return { container, root }
17
+ }
18
+
19
+ function buttonNamed(name: string): HTMLButtonElement {
20
+ const buttons = Array.from(document.querySelectorAll('button'))
21
+ const button = buttons.find(item => item.textContent?.trim() === name)
22
+ if (!(button instanceof HTMLButtonElement)) {
23
+ throw new Error(`Button not found: ${name}`)
24
+ }
25
+ return button
26
+ }
27
+
28
+ function changeTextarea(value: string): void {
29
+ const textarea = document.querySelector('textarea')
30
+ if (!(textarea instanceof HTMLTextAreaElement)) {
31
+ throw new Error('Draft textarea not found')
32
+ }
33
+ const valueSetter = Object.getOwnPropertyDescriptor(
34
+ HTMLTextAreaElement.prototype,
35
+ 'value',
36
+ )?.set
37
+ act(() => {
38
+ valueSetter?.call(textarea, value)
39
+ textarea.dispatchEvent(new InputEvent('input', { bubbles: true }))
40
+ })
41
+ }
42
+
43
+ afterEach(() => {
44
+ document.body.innerHTML = ''
45
+ })
46
+
47
+ describe('AccessibilityReviewDialog', () => {
48
+ it('lets a reviewer draft, edit, and apply an image alt text fix', () => {
49
+ const onChange = vi.fn()
50
+ const html =
51
+ '<figure><img src="revenue-chart.png"><figcaption>Revenue by quarter</figcaption></figure>'
52
+
53
+ render(
54
+ <AccessibilityReviewDialog
55
+ open
56
+ html={html}
57
+ onClose={() => undefined}
58
+ onChange={onChange}
59
+ />,
60
+ )
61
+
62
+ expect(document.body.textContent).toContain('1 findings')
63
+ expect(document.body.textContent).toContain('Image needs alt text')
64
+
65
+ act(() => {
66
+ buttonNamed('Draft fix').click()
67
+ })
68
+
69
+ const textarea = document.querySelector('textarea')
70
+ expect(textarea).toBeInstanceOf(HTMLTextAreaElement)
71
+ expect((textarea as HTMLTextAreaElement).value).toBe('Revenue by quarter')
72
+
73
+ changeTextarea('Quarterly revenue chart')
74
+
75
+ act(() => {
76
+ buttonNamed('Use alt text').click()
77
+ })
78
+
79
+ expect(onChange).toHaveBeenCalledWith(
80
+ expect.stringContaining('alt="Quarterly revenue chart"'),
81
+ )
82
+ })
83
+
84
+ it('applies safe mechanical fixes without opening a draft editor', () => {
85
+ const onChange = vi.fn()
86
+ const html = '<figure><img src="separator.png"></figure>'
87
+
88
+ render(
89
+ <AccessibilityReviewDialog
90
+ open
91
+ html={html}
92
+ onClose={() => undefined}
93
+ onChange={onChange}
94
+ />,
95
+ )
96
+
97
+ act(() => {
98
+ buttonNamed('Apply fix').click()
99
+ })
100
+
101
+ expect(onChange).toHaveBeenCalledWith(expect.stringContaining('alt=""'))
102
+ expect(document.querySelector('textarea')).toBeNull()
103
+ })
104
+ })