@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,77 @@
1
+ import { renderToStaticMarkup } from 'react-dom/server'
2
+ import { describe, expect, it } from 'vitest'
3
+ import {
4
+ StructuredClaimProofCaveatView,
5
+ StructuredFigureCallouts,
6
+ StructuredMetricEvidenceView,
7
+ } from './StructuredEvidenceView.js'
8
+
9
+ describe('StructuredEvidenceView', () => {
10
+ it('renders metric, chart, and table evidence with stable data attributes', () => {
11
+ const html = renderToStaticMarkup(
12
+ <StructuredMetricEvidenceView
13
+ records={[
14
+ {
15
+ id: 'metric_one',
16
+ kind: 'metric',
17
+ value: '88%',
18
+ phrase: '88% automated',
19
+ },
20
+ {
21
+ id: 'chart_one',
22
+ kind: 'chart',
23
+ series: [{ label: 'Chart 3', value: 88, unit: '%' }],
24
+ },
25
+ {
26
+ id: 'table_one',
27
+ kind: 'table',
28
+ columns: ['Evidence', 'Value'],
29
+ rows: [{ cells: ['Chart 3', '88%'] }],
30
+ },
31
+ ]}
32
+ />,
33
+ )
34
+
35
+ expect(html).toContain('data-slides2-structured-evidence="metric_one"')
36
+ expect(html).toContain('data-slides2-evidence-kind="chart"')
37
+ expect(html).toContain('<th>Evidence</th>')
38
+ })
39
+
40
+ it('renders claim/proof/caveat and figure callouts', () => {
41
+ const html = renderToStaticMarkup(
42
+ <>
43
+ <StructuredClaimProofCaveatView
44
+ record={{
45
+ id: 'cpc_one',
46
+ kind: 'claim-proof-caveat',
47
+ claim: 'Automation is inspectable.',
48
+ proof: 'Chart 3',
49
+ caveat: 'Review remains human.',
50
+ }}
51
+ />
52
+ <StructuredFigureCallouts
53
+ records={[
54
+ {
55
+ id: 'figure_one',
56
+ kind: 'annotated-figure',
57
+ regions: [
58
+ {
59
+ label: 'Figure B2',
60
+ x: 0.1,
61
+ y: 0.1,
62
+ w: 0.3,
63
+ h: 0.2,
64
+ callout: 'Review boundary',
65
+ },
66
+ ],
67
+ },
68
+ ]}
69
+ />
70
+ </>,
71
+ )
72
+
73
+ expect(html).toContain('data-slides2-structured-evidence="cpc_one"')
74
+ expect(html).toContain('Review remains human.')
75
+ expect(html).toContain('Figure B2')
76
+ })
77
+ })
@@ -0,0 +1,312 @@
1
+ import type { ReactElement } from 'react'
2
+ import { styled } from 'styled-components'
3
+
4
+ export interface StructuredMetricEvidence {
5
+ id: string
6
+ kind: 'metric'
7
+ value: string
8
+ unit?: string
9
+ phrase: string
10
+ }
11
+
12
+ export interface StructuredTableEvidence {
13
+ id: string
14
+ kind: 'table'
15
+ columns: string[]
16
+ rows: Array<{ cells: string[] }>
17
+ }
18
+
19
+ export interface StructuredChartEvidence {
20
+ id: string
21
+ kind: 'chart'
22
+ series: Array<{ label: string; value: number; unit?: string }>
23
+ }
24
+
25
+ export interface StructuredAnnotatedFigureEvidence {
26
+ id: string
27
+ kind: 'annotated-figure'
28
+ regions: Array<{
29
+ label: string
30
+ x: number
31
+ y: number
32
+ w: number
33
+ h: number
34
+ callout: string
35
+ }>
36
+ }
37
+
38
+ export interface StructuredClaimProofCaveatEvidence {
39
+ id: string
40
+ kind: 'claim-proof-caveat'
41
+ claim: string
42
+ proof: string
43
+ caveat?: string
44
+ }
45
+
46
+ export type StructuredEvidenceViewRecord =
47
+ | StructuredMetricEvidence
48
+ | StructuredTableEvidence
49
+ | StructuredChartEvidence
50
+ | StructuredAnnotatedFigureEvidence
51
+ | StructuredClaimProofCaveatEvidence
52
+
53
+ const EvidencePanel = styled.div`
54
+ display: grid;
55
+ width: 100%;
56
+ height: 100%;
57
+ min-width: 0;
58
+ gap: 10px;
59
+ align-content: stretch;
60
+ overflow: hidden;
61
+ `
62
+
63
+ const MetricGrid = styled.div`
64
+ display: grid;
65
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
66
+ gap: 10px;
67
+ `
68
+
69
+ const MetricCard = styled.div`
70
+ display: grid;
71
+ gap: 4px;
72
+ min-width: 0;
73
+ padding: 10px 12px;
74
+ border: 1px solid currentColor;
75
+ border-radius: 6px;
76
+ background: color-mix(in srgb, currentColor 7%, transparent);
77
+ `
78
+
79
+ const MetricValue = styled.div`
80
+ font-size: 1.45em;
81
+ font-weight: 780;
82
+ line-height: 1;
83
+ `
84
+
85
+ const EvidenceCaption = styled.div`
86
+ font-size: 0.52em;
87
+ font-weight: 620;
88
+ line-height: 1.25;
89
+ opacity: 0.78;
90
+ `
91
+
92
+ const ChartRows = styled.div`
93
+ display: grid;
94
+ gap: 5px;
95
+ `
96
+
97
+ const ChartRow = styled.div`
98
+ display: grid;
99
+ grid-template-columns: minmax(72px, 0.8fr) minmax(60px, 1.4fr) auto;
100
+ gap: 8px;
101
+ align-items: center;
102
+ font-size: 0.58em;
103
+ line-height: 1.1;
104
+ `
105
+
106
+ const ChartTrack = styled.div`
107
+ height: 8px;
108
+ overflow: hidden;
109
+ border-radius: 999px;
110
+ background: color-mix(in srgb, currentColor 16%, transparent);
111
+ `
112
+
113
+ const ChartBar = styled.div<{ $pct: number }>`
114
+ width: ${({ $pct }) => `${Math.max(4, Math.min(100, $pct))}%`};
115
+ height: 100%;
116
+ border-radius: inherit;
117
+ background: currentColor;
118
+ `
119
+
120
+ const EvidenceTable = styled.table`
121
+ width: 100%;
122
+ border-collapse: collapse;
123
+ font-size: 0.52em;
124
+ line-height: 1.18;
125
+
126
+ th,
127
+ td {
128
+ padding: 5px 6px;
129
+ border-bottom: 1px solid color-mix(in srgb, currentColor 20%, transparent);
130
+ text-align: left;
131
+ vertical-align: top;
132
+ }
133
+
134
+ th {
135
+ font-weight: 760;
136
+ }
137
+ `
138
+
139
+ const ClaimProofCaveat = styled.div`
140
+ display: grid;
141
+ grid-template-columns: repeat(3, minmax(0, 1fr));
142
+ gap: 10px;
143
+ height: 100%;
144
+ `
145
+
146
+ const ClaimProofCell = styled.div`
147
+ display: grid;
148
+ align-content: start;
149
+ gap: 6px;
150
+ min-width: 0;
151
+ padding: 10px;
152
+ border: 1px solid color-mix(in srgb, currentColor 20%, transparent);
153
+ border-radius: 6px;
154
+ background: color-mix(in srgb, currentColor 6%, transparent);
155
+ font-size: 0.56em;
156
+ line-height: 1.2;
157
+ `
158
+
159
+ const FigureCallout = styled.div<{
160
+ $x: number
161
+ $y: number
162
+ $w: number
163
+ $h: number
164
+ }>`
165
+ position: absolute;
166
+ left: ${({ $x }) => `${$x * 100}%`};
167
+ top: ${({ $y }) => `${$y * 100}%`};
168
+ width: ${({ $w }) => `${$w * 100}%`};
169
+ min-height: ${({ $h }) => `${$h * 100}%`};
170
+ padding: 5px 7px;
171
+ border: 1px solid currentColor;
172
+ border-radius: 4px;
173
+ background: color-mix(in srgb, var(--slides2-panel, #ffffff) 82%, transparent);
174
+ color: inherit;
175
+ font-size: 10px;
176
+ font-weight: 720;
177
+ line-height: 1.2;
178
+ `
179
+
180
+ export function StructuredMetricEvidenceView({
181
+ records,
182
+ }: {
183
+ records: StructuredEvidenceViewRecord[]
184
+ }): ReactElement {
185
+ const metrics = records.filter(record => record.kind === 'metric')
186
+ const chart = records.find(record => record.kind === 'chart')
187
+ const table = records.find(record => record.kind === 'table')
188
+ const chartMax =
189
+ chart?.series.reduce((max, series) => Math.max(max, series.value), 0) ?? 0
190
+ return (
191
+ <EvidencePanel>
192
+ {metrics.length ? (
193
+ <MetricGrid>
194
+ {metrics.slice(0, 4).map(metric => (
195
+ <MetricCard
196
+ key={metric.id}
197
+ data-slides2-structured-evidence={metric.id}
198
+ data-slides2-evidence-kind={metric.kind}
199
+ >
200
+ <MetricValue>
201
+ {metric.value}
202
+ {metric.unit && !metric.value.endsWith(metric.unit)
203
+ ? ` ${metric.unit}`
204
+ : ''}
205
+ </MetricValue>
206
+ <EvidenceCaption>{metric.phrase}</EvidenceCaption>
207
+ </MetricCard>
208
+ ))}
209
+ </MetricGrid>
210
+ ) : null}
211
+ {chart ? (
212
+ <ChartRows
213
+ data-slides2-structured-evidence={chart.id}
214
+ data-slides2-evidence-kind={chart.kind}
215
+ >
216
+ {chart.series.slice(0, 5).map(series => (
217
+ <ChartRow key={`${chart.id}:${series.label}`}>
218
+ <span>{series.label}</span>
219
+ <ChartTrack>
220
+ <ChartBar
221
+ $pct={chartMax > 0 ? (series.value / chartMax) * 100 : 0}
222
+ />
223
+ </ChartTrack>
224
+ <strong>
225
+ {series.value}
226
+ {series.unit ?? ''}
227
+ </strong>
228
+ </ChartRow>
229
+ ))}
230
+ </ChartRows>
231
+ ) : null}
232
+ {table ? (
233
+ <EvidenceTable
234
+ data-slides2-structured-evidence={table.id}
235
+ data-slides2-evidence-kind={table.kind}
236
+ >
237
+ <thead>
238
+ <tr>
239
+ {table.columns.map(column => (
240
+ <th key={column}>{column}</th>
241
+ ))}
242
+ </tr>
243
+ </thead>
244
+ <tbody>
245
+ {table.rows.slice(0, 4).map((row, index) => (
246
+ <tr key={`${table.id}:${index}`}>
247
+ {row.cells.map((cell, cellIndex) => (
248
+ <td key={`${table.id}:${index}:${cellIndex}`}>{cell}</td>
249
+ ))}
250
+ </tr>
251
+ ))}
252
+ </tbody>
253
+ </EvidenceTable>
254
+ ) : null}
255
+ </EvidencePanel>
256
+ )
257
+ }
258
+
259
+ export function StructuredClaimProofCaveatView({
260
+ record,
261
+ }: {
262
+ record?: StructuredClaimProofCaveatEvidence
263
+ }): ReactElement | null {
264
+ if (!record) return null
265
+ return (
266
+ <ClaimProofCaveat
267
+ data-slides2-structured-evidence={record.id}
268
+ data-slides2-evidence-kind={record.kind}
269
+ >
270
+ <ClaimProofCell>
271
+ <strong>Claim</strong>
272
+ <span>{record.claim}</span>
273
+ </ClaimProofCell>
274
+ <ClaimProofCell>
275
+ <strong>Proof</strong>
276
+ <span>{record.proof}</span>
277
+ </ClaimProofCell>
278
+ <ClaimProofCell>
279
+ <strong>Caveat</strong>
280
+ <span>{record.caveat ?? 'No caveat supplied.'}</span>
281
+ </ClaimProofCell>
282
+ </ClaimProofCaveat>
283
+ )
284
+ }
285
+
286
+ export function StructuredFigureCallouts({
287
+ records,
288
+ }: {
289
+ records: StructuredEvidenceViewRecord[]
290
+ }): ReactElement {
291
+ return (
292
+ <>
293
+ {records
294
+ .filter(record => record.kind === 'annotated-figure')
295
+ .flatMap(record =>
296
+ record.regions.map(region => (
297
+ <FigureCallout
298
+ key={`${record.id}:${region.label}`}
299
+ data-slides2-structured-evidence={record.id}
300
+ data-slides2-evidence-kind={record.kind}
301
+ $x={region.x}
302
+ $y={region.y}
303
+ $w={region.w}
304
+ $h={region.h}
305
+ >
306
+ {region.label}: {region.callout}
307
+ </FigureCallout>
308
+ )),
309
+ )}
310
+ </>
311
+ )
312
+ }
@@ -0,0 +1,13 @@
1
+ export {
2
+ StructuredClaimProofCaveatView,
3
+ StructuredFigureCallouts,
4
+ StructuredMetricEvidenceView,
5
+ } from './StructuredEvidenceView.js'
6
+ export type {
7
+ StructuredAnnotatedFigureEvidence,
8
+ StructuredChartEvidence,
9
+ StructuredClaimProofCaveatEvidence,
10
+ StructuredEvidenceViewRecord,
11
+ StructuredMetricEvidence,
12
+ StructuredTableEvidence,
13
+ } from './StructuredEvidenceView.js'
@@ -0,0 +1,33 @@
1
+ import { styled } from 'styled-components'
2
+
3
+ export type BadgeTone = 'accent' | 'neutral'
4
+
5
+ export interface BadgeProps {
6
+ tone?: BadgeTone
7
+ children: React.ReactNode
8
+ }
9
+
10
+ //#region styled-components
11
+
12
+ const StyledBadge = styled.span<{ $tone: BadgeTone }>`
13
+ padding: 2px var(--platform-spacing-sm);
14
+ border-radius: var(--platform-radius-full);
15
+ font-size: var(--platform-typography-font-size-sm);
16
+ background: ${({ $tone }) =>
17
+ $tone === 'accent'
18
+ ? 'var(--platform-colors-accent-muted)'
19
+ : 'var(--platform-colors-surface-hover)'};
20
+ color: ${({ $tone }) =>
21
+ $tone === 'accent'
22
+ ? 'var(--platform-colors-accent)'
23
+ : 'var(--platform-colors-text-secondary)'};
24
+ `
25
+
26
+ //#endregion
27
+
28
+ export function Badge({
29
+ tone = 'accent',
30
+ children,
31
+ }: BadgeProps): React.ReactElement {
32
+ return <StyledBadge $tone={tone}>{children}</StyledBadge>
33
+ }
@@ -0,0 +1,36 @@
1
+ import { styled } from 'styled-components'
2
+
3
+ export interface CapabilityPillsProps {
4
+ items: string[]
5
+ }
6
+
7
+ //#region styled-components
8
+
9
+ const StyledList = styled.div`
10
+ display: flex;
11
+ flex-wrap: wrap;
12
+ gap: var(--platform-spacing-xs);
13
+ min-width: 0;
14
+ `
15
+
16
+ const StyledPill = styled.span`
17
+ padding: 2px var(--platform-spacing-sm);
18
+ border-radius: var(--platform-radius-full);
19
+ background: var(--platform-colors-surface-active);
20
+ color: var(--platform-colors-text-secondary);
21
+ font-size: var(--platform-typography-font-size-sm);
22
+ `
23
+
24
+ //#endregion
25
+
26
+ export function CapabilityPills({
27
+ items,
28
+ }: CapabilityPillsProps): React.ReactElement {
29
+ return (
30
+ <StyledList>
31
+ {items.map(item => (
32
+ <StyledPill key={item}>{item}</StyledPill>
33
+ ))}
34
+ </StyledList>
35
+ )
36
+ }
@@ -0,0 +1,132 @@
1
+ import type { ReactNode } from 'react'
2
+ import { styled } from 'styled-components'
3
+ import { Button } from '../buttons/Button.js'
4
+ import { FlexCol } from '../containers/flex.js'
5
+ import { Heading } from '../typography/Heading.js'
6
+ import { Kicker } from '../typography/Kicker.js'
7
+ import { Text } from '../typography/Text.js'
8
+
9
+ export type EmptyStateTone = 'neutral' | 'error'
10
+ export type EmptyStateVariant = 'centered' | 'inline'
11
+
12
+ export interface EmptyStateAction {
13
+ label: string
14
+ onClick: () => void
15
+ }
16
+
17
+ export interface EmptyStateProps {
18
+ title: string
19
+ message?: string
20
+ kicker?: string
21
+ tone?: EmptyStateTone
22
+ variant?: EmptyStateVariant
23
+ action?: EmptyStateAction
24
+ actions?: ReactNode
25
+ }
26
+
27
+ //#region styled-components
28
+
29
+ const StyledInlineRoot = styled.div`
30
+ display: grid;
31
+ place-items: start;
32
+ gap: var(--platform-spacing-sm);
33
+ width: auto;
34
+ max-width: 100%;
35
+ align-self: stretch;
36
+ box-sizing: border-box;
37
+ padding: var(--platform-spacing-lg);
38
+ border: 1px dashed var(--platform-colors-border);
39
+ border-radius: var(--platform-radius-md);
40
+ background: var(--platform-colors-surface-hover);
41
+ `
42
+
43
+ const StyledInlineTitle = styled.h3`
44
+ margin: 0;
45
+ font-size: var(--platform-typography-font-size-xl);
46
+ font-weight: var(--platform-typography-font-weight-medium);
47
+ line-height: var(--platform-typography-line-height-tight);
48
+ letter-spacing: 0;
49
+ `
50
+
51
+ const StyledInlineDescription = styled.p`
52
+ max-width: 42rem;
53
+ margin: 0;
54
+ color: var(--platform-colors-text-secondary);
55
+ line-height: var(--platform-typography-line-height-base);
56
+ `
57
+
58
+ const StyledInlineActions = styled.div`
59
+ display: flex;
60
+ flex-wrap: wrap;
61
+ gap: var(--platform-spacing-sm);
62
+ margin-top: var(--platform-spacing-xs);
63
+ `
64
+
65
+ //#endregion
66
+
67
+ export function EmptyState({
68
+ title,
69
+ message,
70
+ kicker,
71
+ tone = 'neutral',
72
+ variant = 'centered',
73
+ action,
74
+ actions,
75
+ }: EmptyStateProps): React.ReactElement {
76
+ if (variant === 'inline') {
77
+ return (
78
+ <StyledInlineRoot>
79
+ {kicker ? <Kicker>{kicker}</Kicker> : null}
80
+ <StyledInlineTitle>{title}</StyledInlineTitle>
81
+ {message ? (
82
+ <StyledInlineDescription>{message}</StyledInlineDescription>
83
+ ) : null}
84
+ {actions ? (
85
+ <StyledInlineActions>{actions}</StyledInlineActions>
86
+ ) : action ? (
87
+ <StyledInlineActions>
88
+ <Button variant="subtle" size="sm" onClick={action.onClick}>
89
+ {action.label}
90
+ </Button>
91
+ </StyledInlineActions>
92
+ ) : null}
93
+ </StyledInlineRoot>
94
+ )
95
+ }
96
+
97
+ return (
98
+ <FlexCol
99
+ $align="center"
100
+ $justify="center"
101
+ $gap="md"
102
+ $flex="1"
103
+ $width="100%"
104
+ style={{
105
+ padding: 'var(--platform-spacing-xxl)',
106
+ textAlign: 'center',
107
+ }}
108
+ >
109
+ <Heading level={2} weight="medium">
110
+ {title}
111
+ </Heading>
112
+ {message ? (
113
+ <FlexCol $align="center" style={{ maxWidth: '36rem' }}>
114
+ <Text
115
+ as="p"
116
+ tone={tone === 'error' ? 'danger' : 'secondary'}
117
+ align="center"
118
+ >
119
+ {message}
120
+ </Text>
121
+ </FlexCol>
122
+ ) : null}
123
+ {actions ? (
124
+ <FlexCol $align="center">{actions}</FlexCol>
125
+ ) : action ? (
126
+ <Button variant="subtle" size="sm" onClick={action.onClick}>
127
+ {action.label}
128
+ </Button>
129
+ ) : null}
130
+ </FlexCol>
131
+ )
132
+ }
@@ -0,0 +1,67 @@
1
+ import type { ReactNode } from 'react'
2
+ import { styled } from 'styled-components'
3
+
4
+ export interface InfoHintProps {
5
+ label: string
6
+ align?: 'left' | 'right'
7
+ children: ReactNode
8
+ }
9
+
10
+ const StyledWrap = styled.span`
11
+ position: relative;
12
+ display: inline-flex;
13
+ align-items: center;
14
+
15
+ &:hover > div,
16
+ &:focus-within > div {
17
+ opacity: 1;
18
+ pointer-events: auto;
19
+ transform: translateY(0);
20
+ }
21
+ `
22
+
23
+ const StyledButton = styled.button`
24
+ width: 26px;
25
+ height: 26px;
26
+ border: 1px solid var(--platform-colors-border, #e1e6ed);
27
+ border-radius: var(--platform-radius-full, 999px);
28
+ background: rgb(255 255 255 / 84%);
29
+ color: var(--platform-colors-text-secondary, #6d7680);
30
+ font-size: 12px;
31
+ font-weight: 900;
32
+ cursor: help;
33
+ `
34
+
35
+ const StyledPopover = styled.div<{ $align: 'left' | 'right' }>`
36
+ position: absolute;
37
+ z-index: 20;
38
+ top: calc(100% + 8px);
39
+ left: ${({ $align }) => ($align === 'right' ? 'auto' : '0')};
40
+ right: ${({ $align }) => ($align === 'right' ? '0' : 'auto')};
41
+ width: min(330px, calc(100vw - 72px));
42
+ border: 1px solid rgb(217 222 229 / 94%);
43
+ border-radius: var(--platform-radius-md, 8px);
44
+ background: rgb(255 255 255 / 98%);
45
+ box-shadow: 0 18px 44px rgb(38 46 55 / 16%);
46
+ padding: 12px 14px;
47
+ color: var(--platform-colors-text, #2e3338);
48
+ opacity: 0;
49
+ pointer-events: none;
50
+ transform: translateY(-4px);
51
+ transition: opacity 120ms ease, transform 120ms ease;
52
+ `
53
+
54
+ export function InfoHint({
55
+ label,
56
+ align = 'left',
57
+ children,
58
+ }: InfoHintProps): React.ReactElement {
59
+ return (
60
+ <StyledWrap>
61
+ <StyledButton type="button" aria-label={label}>
62
+ i
63
+ </StyledButton>
64
+ <StyledPopover $align={align}>{children}</StyledPopover>
65
+ </StyledWrap>
66
+ )
67
+ }