@parhelia/core 0.1.12881 → 0.1.12882

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 (307) hide show
  1. package/dist/components/ui/card.d.ts +1 -3
  2. package/dist/components/ui/card.js +2 -2
  3. package/dist/components/ui/card.js.map +1 -1
  4. package/dist/components/ui/context-menu.js +2 -2
  5. package/dist/config/config.js +7 -8
  6. package/dist/config/config.js.map +1 -1
  7. package/dist/config/types.d.ts +7 -0
  8. package/dist/config/types.js.map +1 -1
  9. package/dist/editor/FieldActionsOverlay.d.ts +1 -0
  10. package/dist/editor/FieldActionsOverlay.js +45 -1
  11. package/dist/editor/FieldActionsOverlay.js.map +1 -1
  12. package/dist/editor/FieldListField.d.ts +1 -1
  13. package/dist/editor/FieldListField.js +18 -20
  14. package/dist/editor/FieldListField.js.map +1 -1
  15. package/dist/editor/ImageEditor.d.ts +1 -6
  16. package/dist/editor/ImageEditor.js +3 -19
  17. package/dist/editor/ImageEditor.js.map +1 -1
  18. package/dist/editor/PictureEditor.d.ts +1 -2
  19. package/dist/editor/PictureEditor.js +14 -5
  20. package/dist/editor/PictureEditor.js.map +1 -1
  21. package/dist/editor/ai/Agents.js +2 -2
  22. package/dist/editor/ai/Agents.js.map +1 -1
  23. package/dist/editor/ai/GuidanceOverlay.js +11 -1
  24. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  25. package/dist/editor/ai/InlineAiDialog.js +11 -22
  26. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  27. package/dist/editor/ai/InlineAiTrigger.js +57 -17
  28. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  29. package/dist/editor/ai/dialogs/capturePageDom.js +36 -66
  30. package/dist/editor/ai/dialogs/capturePageDom.js.map +1 -1
  31. package/dist/editor/ai/dialogs/capturePageScreenshot.js +162 -281
  32. package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
  33. package/dist/editor/ai/terminal/agentSessionState.d.ts +0 -3
  34. package/dist/editor/ai/terminal/agentSessionState.js +1 -3
  35. package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
  36. package/dist/editor/ai/terminal/agentStartRequest.d.ts +1 -2
  37. package/dist/editor/ai/terminal/agentStartRequest.js +1 -2
  38. package/dist/editor/ai/terminal/agentStartRequest.js.map +1 -1
  39. package/dist/editor/ai/terminal/components/AgentCostDisplay.js +1 -1
  40. package/dist/editor/ai/terminal/components/AgentCostDisplay.js.map +1 -1
  41. package/dist/editor/ai/terminal/components/AgentDocumentList.d.ts +0 -7
  42. package/dist/editor/ai/terminal/components/AgentDocumentList.js +13 -55
  43. package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
  44. package/dist/editor/ai/terminal/components/AgentFullPromptControls.d.ts +1 -3
  45. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +14 -22
  46. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
  47. package/dist/editor/ai/terminal/components/AgentModeSelector.js +4 -4
  48. package/dist/editor/ai/terminal/components/AgentModeSelector.js.map +1 -1
  49. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +4 -4
  50. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
  51. package/dist/editor/ai/terminal/components/AgentPromptComposer.js +1 -1
  52. package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
  53. package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +1 -2
  54. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +11 -8
  55. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
  56. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +4 -1
  57. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +14 -31
  58. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
  59. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js +1 -1
  60. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js.map +1 -1
  61. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +1 -2
  62. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +4 -2
  63. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
  64. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js +1 -1
  65. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js.map +1 -1
  66. package/dist/editor/ai/terminal/components/AgentTerminalView.js +2 -13
  67. package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
  68. package/dist/editor/ai/terminal/components/AiResponseMessage.js +14 -16
  69. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  70. package/dist/editor/ai/terminal/components/ContextInfoBar.js +2 -22
  71. package/dist/editor/ai/terminal/components/ContextInfoBar.js.map +1 -1
  72. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js +26 -37
  73. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js.map +1 -1
  74. package/dist/editor/ai/terminal/components/UserMessage.d.ts +1 -2
  75. package/dist/editor/ai/terminal/components/UserMessage.js +8 -144
  76. package/dist/editor/ai/terminal/components/UserMessage.js.map +1 -1
  77. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js +1 -1
  78. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js.map +1 -1
  79. package/dist/editor/ai/terminal/useAgentSessionSync.d.ts +0 -1
  80. package/dist/editor/ai/terminal/useAgentSubmitHandlers.d.ts +1 -3
  81. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +3 -9
  82. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
  83. package/dist/editor/ai/terminal/useAgentTerminalController.js +0 -7
  84. package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
  85. package/dist/editor/ai/terminal/useAgentTerminalUiState.js +1 -1
  86. package/dist/editor/ai/terminal/useAgentTerminalUiState.js.map +1 -1
  87. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js +1 -3
  88. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js.map +1 -1
  89. package/dist/editor/ai/useInlineAiPosition.d.ts +1 -1
  90. package/dist/editor/ai/useInlineAiPosition.js +52 -22
  91. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  92. package/dist/editor/ai-image-editor/AiImageResultOverlay.js +62 -30
  93. package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
  94. package/dist/editor/client/EditorShell.d.ts +1 -5
  95. package/dist/editor/client/EditorShell.js +136 -285
  96. package/dist/editor/client/EditorShell.js.map +1 -1
  97. package/dist/editor/client/editContext.d.ts +5 -33
  98. package/dist/editor/client/editContext.js.map +1 -1
  99. package/dist/editor/client/hooks/useSocketMessageHandler.js +17 -14
  100. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  101. package/dist/editor/client/itemsRepository.d.ts +0 -2
  102. package/dist/editor/client/itemsRepository.js +8 -15
  103. package/dist/editor/client/itemsRepository.js.map +1 -1
  104. package/dist/editor/client/operations.d.ts +1 -1
  105. package/dist/editor/client/operations.js +17 -41
  106. package/dist/editor/client/operations.js.map +1 -1
  107. package/dist/editor/client/pageModelBuilder.js +7 -24
  108. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  109. package/dist/editor/commands/handlers/uiActionHandlers.js +5 -1
  110. package/dist/editor/commands/handlers/uiActionHandlers.js.map +1 -1
  111. package/dist/editor/editor-warnings/FinalWorkflowStateReadOnly.js +5 -0
  112. package/dist/editor/editor-warnings/FinalWorkflowStateReadOnly.js.map +1 -1
  113. package/dist/editor/editor-warnings/ItemLocked.js +6 -3
  114. package/dist/editor/editor-warnings/ItemLocked.js.map +1 -1
  115. package/dist/editor/field-types/MultiLineText.js +3 -10
  116. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  117. package/dist/editor/field-types/RawEditor.js +1 -8
  118. package/dist/editor/field-types/RawEditor.js.map +1 -1
  119. package/dist/editor/field-types/RichTextEditorComponent.js +45 -156
  120. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  121. package/dist/editor/field-types/SingleLineText.js +3 -10
  122. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  123. package/dist/editor/field-types/richtext/components/ReactSlate.js +2 -8
  124. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  125. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +2 -1
  126. package/dist/editor/field-types/richtext/contextMenuFactory.js +303 -100
  127. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  128. package/dist/editor/field-types/richtext/types.d.ts +0 -2
  129. package/dist/editor/field-types/richtext/types.js.map +1 -1
  130. package/dist/editor/media-selector/MediaFolderBrowser.d.ts +2 -1
  131. package/dist/editor/media-selector/MediaFolderBrowser.js +19 -9
  132. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  133. package/dist/editor/media-selector/TreeSelector.js +30 -24
  134. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  135. package/dist/editor/media-selector/UploadZone.d.ts +2 -1
  136. package/dist/editor/media-selector/UploadZone.js +21 -9
  137. package/dist/editor/media-selector/UploadZone.js.map +1 -1
  138. package/dist/editor/menubar/PageSelector.js +2 -8
  139. package/dist/editor/menubar/PageSelector.js.map +1 -1
  140. package/dist/editor/menubar/VersionPreviewCard.js +249 -4
  141. package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
  142. package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
  143. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  144. package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +10 -0
  145. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +462 -63
  146. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  147. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +1 -1
  148. package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +2 -5
  149. package/dist/editor/page-editor-chrome/CommentHighlightings.js +215 -340
  150. package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
  151. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.d.ts +1 -5
  152. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js +4 -11
  153. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
  154. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +13 -21
  155. package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
  156. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +29 -23
  157. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
  158. package/dist/editor/page-editor-chrome/FrameMenu.js +19 -110
  159. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  160. package/dist/editor/page-editor-chrome/InlineEditor.d.ts +7 -0
  161. package/dist/editor/page-editor-chrome/InlineEditor.js +1719 -0
  162. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -0
  163. package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +2 -3
  164. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +45 -148
  165. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
  166. package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +0 -2
  167. package/dist/editor/page-editor-chrome/PageEditorChrome.js +21 -25
  168. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
  169. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +128 -163
  170. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
  171. package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +1 -1
  172. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +3 -6
  173. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  174. package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +2 -1
  175. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +146 -83
  176. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  177. package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +2 -5
  178. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +63 -144
  179. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
  180. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +2 -1
  181. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +30 -101
  182. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
  183. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +1 -10
  184. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +122 -105
  185. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
  186. package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +4 -11
  187. package/dist/editor/page-editor-chrome/overlay/geometry.js +36 -139
  188. package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
  189. package/dist/editor/page-editor-chrome/overlay/iframeAccess.d.ts +2 -0
  190. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js +21 -0
  191. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js.map +1 -0
  192. package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +7 -0
  193. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +758 -0
  194. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -0
  195. package/dist/editor/page-viewer/EditorForm.js +1 -17
  196. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  197. package/dist/editor/page-viewer/MiniMap.d.ts +2 -2
  198. package/dist/editor/page-viewer/MiniMap.js +364 -176
  199. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  200. package/dist/editor/page-viewer/PageViewer.js +13 -40
  201. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  202. package/dist/editor/page-viewer/PageViewerFrame.d.ts +5 -0
  203. package/dist/editor/page-viewer/PageViewerFrame.js +1509 -1527
  204. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  205. package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +3 -0
  206. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +796 -0
  207. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -0
  208. package/dist/editor/page-viewer/pageViewContext.d.ts +0 -32
  209. package/dist/editor/page-viewer/pageViewContext.js +6 -37
  210. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  211. package/dist/editor/reviews/Comment.d.ts +1 -2
  212. package/dist/editor/reviews/Comment.js +4 -9
  213. package/dist/editor/reviews/Comment.js.map +1 -1
  214. package/dist/editor/reviews/CommentEditor.js +1 -1
  215. package/dist/editor/reviews/CommentEditor.js.map +1 -1
  216. package/dist/editor/reviews/CommentPopover.js +9 -68
  217. package/dist/editor/reviews/CommentPopover.js.map +1 -1
  218. package/dist/editor/reviews/CommentView.js +4 -24
  219. package/dist/editor/reviews/CommentView.js.map +1 -1
  220. package/dist/editor/reviews/Comments.d.ts +2 -0
  221. package/dist/editor/reviews/Comments.js +30 -29
  222. package/dist/editor/reviews/Comments.js.map +1 -1
  223. package/dist/editor/reviews/FeedbackCard.d.ts +2 -4
  224. package/dist/editor/reviews/FeedbackCard.js +5 -5
  225. package/dist/editor/reviews/FeedbackCard.js.map +1 -1
  226. package/dist/editor/reviews/SuggestedEdit.js +6 -4
  227. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  228. package/dist/editor/reviews/SuggestionDisplayPopover.js +2 -3
  229. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  230. package/dist/editor/reviews/commentAi.js +27 -96
  231. package/dist/editor/reviews/commentAi.js.map +1 -1
  232. package/dist/editor/reviews/feedbackSelection.js +4 -32
  233. package/dist/editor/reviews/feedbackSelection.js.map +1 -1
  234. package/dist/editor/services/agentService.d.ts +0 -15
  235. package/dist/editor/services/agentService.js +1 -11
  236. package/dist/editor/services/agentService.js.map +1 -1
  237. package/dist/editor/services/contentService.d.ts +1 -0
  238. package/dist/editor/services/contentService.js.map +1 -1
  239. package/dist/editor/services/reviewsService.d.ts +2 -2
  240. package/dist/editor/services/reviewsService.js.map +1 -1
  241. package/dist/editor/settings/SettingsView.js +2 -2
  242. package/dist/editor/settings/SettingsView.js.map +1 -1
  243. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
  244. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  245. package/dist/editor/settings/panels/ProvidersPanel.js +3 -2
  246. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  247. package/dist/editor/sidebar/MorePanelsButton.js +1 -1
  248. package/dist/editor/sidebar/MorePanelsButton.js.map +1 -1
  249. package/dist/editor/sidebar/Workbox.js +1 -1
  250. package/dist/editor/sidebar/Workbox.js.map +1 -1
  251. package/dist/editor/ui/IconSelectorDialog.js +1 -1
  252. package/dist/editor/ui/IconSelectorDialog.js.map +1 -1
  253. package/dist/editor/ui/SimpleIconButton.d.ts +2 -2
  254. package/dist/editor/ui/SimpleIconButton.js +1 -1
  255. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  256. package/dist/editor/utils.d.ts +17 -1
  257. package/dist/editor/utils.js +143 -0
  258. package/dist/editor/utils.js.map +1 -1
  259. package/dist/editor/version-diff/versionDiffTargets.d.ts +8 -3
  260. package/dist/editor/version-diff/versionDiffTargets.js +94 -37
  261. package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
  262. package/dist/editor/views/MediaFolderEditView.js +1 -1
  263. package/dist/editor/views/MediaFolderEditView.js.map +1 -1
  264. package/dist/revision.d.ts +2 -2
  265. package/dist/revision.js +2 -2
  266. package/dist/splash-screen/DialogWrappers.js +2 -2
  267. package/dist/splash-screen/DialogWrappers.js.map +1 -1
  268. package/dist/splash-screen/ModernSplashScreen.js +3 -11
  269. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  270. package/dist/splash-screen/NewPage.js +5 -7
  271. package/dist/splash-screen/NewPage.js.map +1 -1
  272. package/dist/splash-screen/OpenPage.js +3 -5
  273. package/dist/splash-screen/OpenPage.js.map +1 -1
  274. package/dist/splash-screen/RecentPages.js +3 -3
  275. package/dist/splash-screen/RecentPages.js.map +1 -1
  276. package/package.json +1 -2
  277. package/styles.css +0 -49
  278. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +0 -5
  279. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +0 -12
  280. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +0 -1
  281. package/dist/editor/bridge/BridgeClient.d.ts +0 -80
  282. package/dist/editor/bridge/BridgeClient.js +0 -417
  283. package/dist/editor/bridge/BridgeClient.js.map +0 -1
  284. package/dist/editor/field-types/useFormFieldCaretPresence.d.ts +0 -13
  285. package/dist/editor/field-types/useFormFieldCaretPresence.js +0 -92
  286. package/dist/editor/field-types/useFormFieldCaretPresence.js.map +0 -1
  287. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +0 -6
  288. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +0 -123
  289. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +0 -1
  290. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +0 -26
  291. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +0 -222
  292. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +0 -1
  293. package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +0 -20
  294. package/dist/editor/page-viewer/bridgeFieldPatch.js +0 -33
  295. package/dist/editor/page-viewer/bridgeFieldPatch.js.map +0 -1
  296. package/dist/editor/reviews/commentTransientSelection.d.ts +0 -23
  297. package/dist/editor/reviews/commentTransientSelection.js +0 -7
  298. package/dist/editor/reviews/commentTransientSelection.js.map +0 -1
  299. package/dist/editor/reviews/feedbackOrdering.d.ts +0 -5
  300. package/dist/editor/reviews/feedbackOrdering.js +0 -27
  301. package/dist/editor/reviews/feedbackOrdering.js.map +0 -1
  302. package/dist/editor/reviews/suggestedEditState.d.ts +0 -12
  303. package/dist/editor/reviews/suggestedEditState.js +0 -90
  304. package/dist/editor/reviews/suggestedEditState.js.map +0 -1
  305. package/dist/editor/reviews/suggestionDisplayValue.d.ts +0 -43
  306. package/dist/editor/reviews/suggestionDisplayValue.js +0 -93
  307. package/dist/editor/reviews/suggestionDisplayValue.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
3
  import { useEditContext } from "../client/editContext";
4
4
  import { PlaceholderDropZones } from "../page-editor-chrome/PlaceholderDropZones";
5
5
  import { FieldEditedIndicators } from "../page-editor-chrome/FieldEditedIndicators";
@@ -7,54 +7,55 @@ import { CommentHighlightings } from "../page-editor-chrome/CommentHighlightings
7
7
  import { SuggestionHighlightings } from "../page-editor-chrome/SuggestionHighlightings";
8
8
  import { VersionDiffHighlightings } from "../page-editor-chrome/VersionDiffHighlightings";
9
9
  import { IframeOverlayProvider } from "../page-editor-chrome/overlay/IframeOverlayProvider";
10
- export const BRIDGE_DOM_UPDATED_EVENT = "parhelia:bridge-dom-updated";
11
- export function MiniMap({ compareView, scroll, pageViewContext, }) {
10
+ function getAccessibleIframeDocument(iframe) {
11
+ if (!iframe)
12
+ return null;
13
+ try {
14
+ return iframe.contentDocument || iframe.contentWindow?.document || null;
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ function isElementNode(node) {
21
+ return node?.nodeType === 1;
22
+ }
23
+ export function MiniMap({ compareView, deviceHeight, scroll, mainViewIframeRef, pageViewContext, }) {
12
24
  const editContext = useEditContext();
13
25
  const [scale, setScale] = useState(1);
14
26
  const minimapRef = useRef(null);
15
27
  const scaleContainerRef = useRef(null);
16
28
  const iframeRef = useRef(null);
17
29
  const [minimapReady, setMinimapReady] = useState(false);
18
- const [bridgeDomRevision, setBridgeDomRevision] = useState(0);
30
+ const [refreshScale, setRefreshScale] = useState(0);
31
+ const observerRef = useRef(null);
32
+ const resizeObserverRef = useRef(null);
33
+ const assetLoadHandlerRef = useRef(null);
19
34
  const minimapContainerRef = useRef(null);
20
- const viewport = pageViewContext.viewport;
21
- const bridgeDom = pageViewContext.bridgeDom;
22
- const bridgeMetrics = bridgeDom
23
- ? getBridgeMinimapMetrics(bridgeDom, viewport)
24
- : null;
25
- const isBridgeMinimap = !!bridgeDom && !!bridgeMetrics;
26
- const bridgeMinimapHtml = useMemo(() => bridgeDom
27
- ? createBridgeMinimapHtml(bridgeDom.html, pageViewContext.bridgeGeometry, bridgeDom.viewport.width || viewport.width)
28
- : undefined, [
29
- bridgeDom,
30
- bridgeDomRevision,
31
- pageViewContext.bridgeGeometry,
32
- viewport.width,
33
- ]);
34
- const getDocumentMetrics = useCallback(() => {
35
- return getBridgeMinimapMetrics(pageViewContext.bridgeDom, viewport, scroll);
36
- }, [bridgeDomRevision, pageViewContext.bridgeDom, scroll, viewport]);
37
- const minimapMetrics = getDocumentMetrics();
35
+ const getScrollContainer = useCallback(() => {
36
+ const doc = getAccessibleIframeDocument(mainViewIframeRef.current);
37
+ return doc?.scrollingElement || doc?.body || null;
38
+ }, [mainViewIframeRef]);
38
39
  const calcAndUpdateScale = () => {
40
+ const viewport = pageViewContext.viewport;
39
41
  const minimapHeight = minimapContainerRef.current?.clientHeight;
40
- const metrics = getDocumentMetrics();
41
- if (!metrics)
42
+ const scrollContainer = getScrollContainer();
43
+ if (!viewport || !scrollContainer)
42
44
  return;
43
- const scaleX = (editContext?.configuration.outline.width || 100) / metrics.viewportWidth;
44
- const scaleY = (minimapHeight || metrics.viewportHeight) / metrics.documentHeight;
45
+ const width = viewport.width;
46
+ const scaleX = (editContext?.configuration.outline.width || 100) / width;
47
+ const scaleY = Math.max(deviceHeight || 0, minimapHeight || viewport.height) /
48
+ scrollContainer.scrollHeight;
45
49
  const newScale = Math.min(scaleX, scaleY, 1);
46
50
  updateScale(newScale);
47
51
  setScale(newScale);
52
+ syncDimensions();
48
53
  return newScale;
49
54
  };
50
55
  // Prevent scale/width feedback loop by tracking previous values
51
56
  const prevScaleRef = useRef(scale);
52
57
  const prevWidthRef = useRef(0);
53
- const currentWidth = Math.max(30, scale *
54
- (minimapMetrics?.viewportWidth ||
55
- bridgeMetrics?.viewportWidth ||
56
- pageViewContext.viewport.width ||
57
- 0));
58
+ const currentWidth = Math.max(30, scale * (pageViewContext.viewport.width || 0));
58
59
  // Only update if change is significant (>1px) to avoid minor oscillations
59
60
  let miniMapWidth;
60
61
  if (prevWidthRef.current < currentWidth ||
@@ -67,60 +68,333 @@ export function MiniMap({ compareView, scroll, pageViewContext, }) {
67
68
  else {
68
69
  miniMapWidth = prevWidthRef.current;
69
70
  }
70
- useEffect(() => {
71
- setMinimapReady(isBridgeMinimap);
72
- }, [isBridgeMinimap]);
73
- useEffect(() => {
74
- const handleBridgeDomUpdated = () => {
75
- setBridgeDomRevision((revision) => revision + 1);
71
+ function getNodePath(node) {
72
+ const path = [];
73
+ let current = node;
74
+ if (node?.tagName === "HTML")
75
+ return null;
76
+ while (current &&
77
+ current !== current.ownerDocument?.documentElement &&
78
+ current.parentNode) {
79
+ const index = Array.prototype.indexOf.call(current.parentNode.childNodes, current);
80
+ path.unshift(index);
81
+ current = current.parentNode;
82
+ }
83
+ return path;
84
+ }
85
+ function findCorrespondingNode(node) {
86
+ const path = getNodePath(node);
87
+ if (!path)
88
+ return null;
89
+ const minimapDoc = getAccessibleIframeDocument(iframeRef.current);
90
+ if (!minimapDoc)
91
+ return null;
92
+ let correspondingNode = minimapDoc.documentElement;
93
+ let originalNode = getAccessibleIframeDocument(mainViewIframeRef.current)?.documentElement;
94
+ for (const index of path) {
95
+ if (!originalNode || !correspondingNode)
96
+ return null;
97
+ if (originalNode.childNodes.length !== correspondingNode.childNodes.length)
98
+ return null;
99
+ originalNode = originalNode.childNodes[index] ?? null;
100
+ correspondingNode = correspondingNode.childNodes[index] ?? null;
101
+ }
102
+ return isElementNode(correspondingNode) ? correspondingNode : null;
103
+ }
104
+ function updateCorrespondingNode(node) {
105
+ const path = getNodePath(node);
106
+ if (!path)
107
+ return;
108
+ const minimapDoc = getAccessibleIframeDocument(iframeRef.current);
109
+ if (!minimapDoc)
110
+ return;
111
+ let correspondingNode = minimapDoc.documentElement;
112
+ let originalNode = getAccessibleIframeDocument(mainViewIframeRef.current)?.documentElement;
113
+ for (const index of path) {
114
+ if (originalNode && correspondingNode) {
115
+ if (originalNode.childNodes.length !== correspondingNode.childNodes.length) {
116
+ // When the mismatch is at the document root (HTML), only sync the
117
+ // body element instead of replacing the entire innerHTML. Replacing
118
+ // HTML.innerHTML causes a visible flash and can create a duplicate
119
+ // HEAD element in the minimap iframe.
120
+ if (isElementNode(originalNode) && originalNode.tagName === "HTML") {
121
+ const srcBody = originalNode.ownerDocument?.body;
122
+ const dstBody = correspondingNode.ownerDocument?.body;
123
+ if (srcBody && dstBody) {
124
+ dstBody.innerHTML = srcBody.innerHTML;
125
+ }
126
+ return;
127
+ }
128
+ if (!isElementNode(originalNode) ||
129
+ !isElementNode(correspondingNode)) {
130
+ return;
131
+ }
132
+ correspondingNode.innerHTML = originalNode.innerHTML;
133
+ return;
134
+ }
135
+ }
136
+ if (originalNode) {
137
+ originalNode = originalNode.childNodes[index] ?? null;
138
+ }
139
+ if (correspondingNode) {
140
+ correspondingNode = correspondingNode.childNodes[index] ?? null;
141
+ }
142
+ }
143
+ if (isElementNode(correspondingNode) && isElementNode(originalNode)) {
144
+ if (originalNode.tagName === "HEAD") {
145
+ correspondingNode.innerHTML = originalNode.innerHTML;
146
+ }
147
+ else if (correspondingNode.parentNode?.nodeType === Node.DOCUMENT_NODE) {
148
+ correspondingNode.innerHTML = originalNode.innerHTML;
149
+ }
150
+ else {
151
+ correspondingNode.outerHTML = originalNode.outerHTML;
152
+ }
153
+ }
154
+ }
155
+ const handleLoad = () => {
156
+ const sourceDoc = getAccessibleIframeDocument(mainViewIframeRef.current);
157
+ if (!sourceDoc)
158
+ return;
159
+ if (!iframeRef.current || !mainViewIframeRef.current)
160
+ return;
161
+ observerRef.current?.disconnect();
162
+ resizeObserverRef.current?.disconnect();
163
+ if (assetLoadHandlerRef.current) {
164
+ sourceDoc.removeEventListener("load", assetLoadHandlerRef.current, true);
165
+ assetLoadHandlerRef.current = null;
166
+ }
167
+ mirrorIframeContent(mainViewIframeRef.current, iframeRef.current);
168
+ const observer = new MutationObserver((mutationsList) => {
169
+ const minimapDoc = getAccessibleIframeDocument(iframeRef.current);
170
+ if (!minimapDoc)
171
+ return;
172
+ // Sync attribute mutations lightweight — copy only the changed attribute
173
+ const attributeMutations = mutationsList.filter((x) => x.type === "attributes" && x.attributeName && x.target.parentElement);
174
+ for (const mutation of attributeMutations) {
175
+ const target = mutation.target;
176
+ if (!isElementNode(target) || target.tagName === "HTML")
177
+ continue;
178
+ const correspondingNode = findCorrespondingNode(target);
179
+ if (!correspondingNode) {
180
+ updateCorrespondingNode(target.parentElement ?? target);
181
+ continue;
182
+ }
183
+ const attrName = mutation.attributeName;
184
+ const value = target.getAttribute(attrName);
185
+ if (value !== null) {
186
+ correspondingNode.setAttribute(attrName, value);
187
+ }
188
+ else {
189
+ correspondingNode.removeAttribute(attrName);
190
+ }
191
+ }
192
+ // Structural mutations (childList / characterData) need full DOM sync
193
+ const structuralMutations = mutationsList.filter((x) => x.type === "childList" || x.type === "characterData");
194
+ if (structuralMutations.length === 0)
195
+ return;
196
+ const targetNodes = structuralMutations
197
+ .filter((x) => x.type === "childList" && x.target.parentElement)
198
+ .map((m) => m.target)
199
+ .concat(structuralMutations
200
+ .filter((x) => x.type === "characterData")
201
+ .map((m) => m.target.parentElement));
202
+ const distinctTargetNodes = Array.from(new Set(targetNodes));
203
+ const nodesToRemove = new Set();
204
+ for (let i = 0; i < distinctTargetNodes.length; i++) {
205
+ for (let j = 0; j < distinctTargetNodes.length; j++) {
206
+ if (i !== j) {
207
+ if (distinctTargetNodes[i]?.contains(distinctTargetNodes[j])) {
208
+ nodesToRemove.add(distinctTargetNodes[j]);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ const filteredNodes = distinctTargetNodes.filter((node) => !nodesToRemove.has(node));
214
+ filteredNodes.forEach((targetNode) => {
215
+ if (isElementNode(targetNode)) {
216
+ updateCorrespondingNode(targetNode);
217
+ }
218
+ });
219
+ // Re-bake dimensions in the same tick as the structural sync so the
220
+ // source/destination tree pairing stays consistent — MutationObserver
221
+ // callbacks are microtasks, no other JS can run between the two.
222
+ syncDimensions();
223
+ setRefreshScale((x) => x + 1);
224
+ });
225
+ observer.observe(sourceDoc, {
226
+ childList: true, // observe direct children changes
227
+ subtree: true, // observe all descendants changes
228
+ characterData: true, // observe text changes
229
+ attributes: true, // observe attribute changes (like style or class)
230
+ });
231
+ // Catch async layout changes that don't trigger the MutationObserver:
232
+ // image/video metadata loading, web font swap-in, CSS animations
233
+ // settling, and iframe-size changes from device-mode toggles.
234
+ const ro = new ResizeObserver(() => {
235
+ syncDimensions();
236
+ setRefreshScale((x) => x + 1);
237
+ });
238
+ ro.observe(sourceDoc.documentElement);
239
+ if (mainViewIframeRef.current) {
240
+ ro.observe(mainViewIframeRef.current);
241
+ }
242
+ if (minimapContainerRef.current) {
243
+ ro.observe(minimapContainerRef.current);
244
+ }
245
+ resizeObserverRef.current = ro;
246
+ const onAssetLoad = () => {
247
+ syncDimensions();
76
248
  };
77
- window.addEventListener(BRIDGE_DOM_UPDATED_EVENT, handleBridgeDomUpdated);
249
+ // <img>/<video>/<iframe> 'load' events don't bubble — capture phase
250
+ // catches them at the document root.
251
+ sourceDoc.addEventListener("load", onAssetLoad, true);
252
+ assetLoadHandlerRef.current = onAssetLoad;
253
+ setMinimapReady(true);
254
+ observerRef.current = observer;
255
+ };
256
+ useEffect(() => {
257
+ if (mainViewIframeRef?.current) {
258
+ mainViewIframeRef?.current.addEventListener("load", handleLoad);
259
+ }
260
+ handleLoad();
261
+ // Cleanup function
78
262
  return () => {
79
- window.removeEventListener(BRIDGE_DOM_UPDATED_EVENT, handleBridgeDomUpdated);
263
+ observerRef.current?.disconnect();
264
+ observerRef.current = null;
265
+ resizeObserverRef.current?.disconnect();
266
+ resizeObserverRef.current = null;
267
+ const sourceDoc = getAccessibleIframeDocument(mainViewIframeRef.current);
268
+ if (sourceDoc && assetLoadHandlerRef.current) {
269
+ sourceDoc.removeEventListener("load", assetLoadHandlerRef.current, true);
270
+ }
271
+ assetLoadHandlerRef.current = null;
272
+ mainViewIframeRef?.current?.removeEventListener("load", handleLoad);
80
273
  };
81
- }, []);
274
+ }, [mainViewIframeRef.current, iframeRef.current]);
82
275
  useEffect(() => {
83
276
  calcAndUpdateScale();
84
277
  }, [
85
- isBridgeMinimap,
278
+ refreshScale,
279
+ mainViewIframeRef,
280
+ //pageViewContext?.windowSize,
86
281
  pageViewContext?.zoom,
87
282
  pageViewContext.viewport,
88
283
  pageViewContext.deviceHeight,
89
284
  pageViewContext.deviceWidth,
90
- pageViewContext.bridgeDom,
91
- bridgeDomRevision,
92
285
  ]);
93
286
  const scrollDocumentTo = (y) => {
94
- const metrics = getDocumentMetrics();
95
- if (!metrics)
287
+ if (!mainViewIframeRef?.current)
96
288
  return;
97
- const maxScrollTop = Math.max(0, metrics.documentHeight - metrics.viewportHeight);
98
- const targetY = Math.min(maxScrollTop, Math.max(0, y));
99
- const currentY = pageViewContext.bridgeGeometry?.scroll.y ??
100
- scroll ??
101
- pageViewContext.bridgeDom?.scroll.y ??
102
- metrics.scrollTop;
103
- pageViewContext.requestBridgeScrollBy?.({
104
- y: targetY - currentY,
105
- behavior: "smooth",
106
- });
289
+ const scrollContainer = getScrollContainer();
290
+ if (!scrollContainer)
291
+ return;
292
+ const scrollOptions = { top: y, behavior: "smooth" };
293
+ const scrollWindow = mainViewIframeRef.current.contentWindow;
294
+ if (scrollWindow) {
295
+ scrollWindow.scrollTo(scrollOptions);
296
+ return;
297
+ }
298
+ scrollContainer.scrollTo(scrollOptions);
107
299
  };
300
+ const scrollHeight = getScrollContainer()?.scrollHeight;
301
+ const scrollTop = scroll;
302
+ const viewport = pageViewContext.viewport;
303
+ function mirrorIframeContent(sourceIframe, targetIframe) {
304
+ const sourceDoc = getAccessibleIframeDocument(sourceIframe);
305
+ const targetDoc = getAccessibleIframeDocument(targetIframe);
306
+ // Check that both documents AND their documentElements exist
307
+ if (sourceDoc?.documentElement && targetDoc?.documentElement) {
308
+ const sourceHtml = sourceDoc.documentElement.innerHTML;
309
+ targetDoc.documentElement.innerHTML = sourceHtml;
310
+ targetDoc.documentElement.style.overflow = "hidden";
311
+ const targetHead = targetDoc.documentElement.querySelector("head");
312
+ // Inject CSS to constrain media elements in minimap. Width/height for
313
+ // <video> are now baked by syncDimensions() so we no longer need the
314
+ // viewport-unit (`max-height: 100vh`) hack that misresolved against the
315
+ // tall minimap iframe.
316
+ let style = targetHead?.querySelector("style[data-minimap-constraints]");
317
+ if (!style && targetHead) {
318
+ style = targetDoc.createElement("style");
319
+ style.setAttribute("data-minimap-constraints", "true");
320
+ style.textContent = `
321
+ video, img, picture, iframe {
322
+ max-width: 100% !important;
323
+ height: auto !important;
324
+ }
325
+ `;
326
+ targetHead.appendChild(style);
327
+ }
328
+ }
329
+ syncDimensions();
330
+ setRefreshScale((x) => x + 1);
331
+ }
332
+ // Bake the main iframe's resolved layout (width/height per element, plus
333
+ // top/left for absolute/fixed elements) into the minimap clone as inline
334
+ // !important px styles. This neutralizes vh/vw drift between the two
335
+ // iframes (their layout viewports differ — main = deviceHeight, minimap =
336
+ // scrollHeight) and any other unit/calc/percentage that would resolve
337
+ // differently inside the minimap document.
338
+ function syncDimensions() {
339
+ const sourceDoc = getAccessibleIframeDocument(mainViewIframeRef.current);
340
+ const targetDoc = getAccessibleIframeDocument(iframeRef.current);
341
+ if (!sourceDoc?.body || !targetDoc?.body)
342
+ return;
343
+ const srcView = sourceDoc.defaultView;
344
+ if (!srcView)
345
+ return;
346
+ walkDimensions(sourceDoc.body, targetDoc.body, srcView);
347
+ }
348
+ function walkDimensions(src, dst, srcView) {
349
+ // We can't use `instanceof HTMLElement` here because src/dst live in
350
+ // different window realms (main iframe / minimap iframe) than this
351
+ // component, so each realm has its own HTMLElement constructor and the
352
+ // check would always be false. Use duck typing instead.
353
+ const srcEl = src;
354
+ const dstEl = dst;
355
+ const dstStyle = dstEl.style;
356
+ if (dstStyle && typeof srcEl.getBoundingClientRect === "function") {
357
+ const rect = srcEl.getBoundingClientRect();
358
+ if (rect.width > 0 || rect.height > 0) {
359
+ dstStyle.setProperty("width", `${rect.width}px`, "important");
360
+ dstStyle.setProperty("height", `${rect.height}px`, "important");
361
+ }
362
+ const cs = srcView.getComputedStyle(srcEl);
363
+ if (cs.position === "absolute" || cs.position === "fixed") {
364
+ const offsetParent = srcEl.offsetParent;
365
+ const parentRect = offsetParent?.getBoundingClientRect();
366
+ if (parentRect) {
367
+ dstStyle.setProperty("left", `${rect.left - parentRect.left}px`, "important");
368
+ dstStyle.setProperty("top", `${rect.top - parentRect.top}px`, "important");
369
+ dstStyle.removeProperty("right");
370
+ dstStyle.removeProperty("bottom");
371
+ }
372
+ }
373
+ }
374
+ // Walk children in lock-step. Bail at any divergent subtree — the
375
+ // MutationObserver path keeps structures aligned, so this is purely
376
+ // defensive.
377
+ const sChildren = src.children;
378
+ const dChildren = dst.children;
379
+ const len = Math.min(sChildren.length, dChildren.length);
380
+ for (let i = 0; i < len; i++) {
381
+ walkDimensions(sChildren[i], dChildren[i], srcView);
382
+ }
383
+ }
108
384
  const updateScale = (scale) => {
109
- if (!scaleContainerRef.current)
385
+ const scrollContainer = getScrollContainer();
386
+ if (!iframeRef.current || !scaleContainerRef.current)
110
387
  return;
111
- const metrics = getDocumentMetrics();
112
- if (!metrics)
388
+ if (!scrollContainer)
113
389
  return;
114
390
  scaleContainerRef.current.style.transform = `scale(${scale})`;
115
391
  scaleContainerRef.current.style.transformOrigin = "0 0";
116
- if (iframeRef.current) {
117
- iframeRef.current.style.width = `${metrics?.viewportWidth ?? 0}px`;
118
- iframeRef.current.style.height = `${metrics?.documentHeight ?? 0}px`;
119
- }
392
+ iframeRef.current.style.width = `${scrollContainer?.clientWidth}px`;
393
+ iframeRef.current.style.height = `${scrollContainer?.scrollHeight}px`;
120
394
  };
121
395
  const handleClick = (e) => {
122
- const metrics = getDocumentMetrics();
123
- if (!metrics)
396
+ const scrollContainer = getScrollContainer();
397
+ if (!scrollContainer)
124
398
  return;
125
399
  // Check if click was on an actual control. Passive minimap overlays also
126
400
  // use pointer-events-auto so they can display hover affordances, but they
@@ -138,22 +412,33 @@ export function MiniMap({ compareView, scroll, pageViewContext, }) {
138
412
  const clickReferenceRect = iframeRect && iframeRect.height > 0 ? iframeRect : containerRect;
139
413
  const absY = e.clientY - clickReferenceRect.top;
140
414
  const clickRatio = Math.min(1, Math.max(0, absY / clickReferenceRect.height));
141
- const maxScrollTop = Math.max(0, metrics.documentHeight - metrics.viewportHeight);
415
+ const visibleIframeHeight = mainViewIframeRef.current?.getBoundingClientRect().height ||
416
+ mainViewIframeRef.current?.clientHeight;
417
+ const currentViewportHeight = visibleIframeHeight ||
418
+ scrollContainer.ownerDocument?.defaultView?.innerHeight ||
419
+ scrollContainer.clientHeight ||
420
+ viewport.height;
421
+ const maxScrollTop = Math.max(0, scrollContainer.scrollHeight - currentViewportHeight);
142
422
  e.stopPropagation();
143
423
  scrollDocumentTo(clickRatio * maxScrollTop);
144
424
  };
145
425
  const handleScroll = useCallback((e) => {
146
- pageViewContext.requestBridgeScrollBy?.({
147
- x: 0,
148
- y: e.deltaY,
426
+ const scrollContainer = getScrollContainer();
427
+ if (!scrollContainer)
428
+ return;
429
+ scrollContainer.scrollBy({
430
+ behavior: "instant",
431
+ left: 0,
432
+ top: e.deltaY,
433
+ });
434
+ getAccessibleIframeDocument(mainViewIframeRef.current)?.documentElement?.scrollBy({
149
435
  behavior: "instant",
436
+ left: 0,
437
+ top: e.deltaY,
150
438
  });
151
439
  e.stopPropagation();
152
- }, [pageViewContext]);
153
- const viewportHighlight = minimapMetrics
154
- ? getMinimapViewportHighlight(minimapMetrics, scale)
155
- : null;
156
- if (!editContext || !isBridgeMinimap) {
440
+ }, [getScrollContainer, mainViewIframeRef]);
441
+ if (!editContext || !mainViewIframeRef.current) {
157
442
  return null;
158
443
  }
159
444
  return (_jsxs("div", { "data-testid": "minimap-container", className: "relative cursor-pointer overflow-hidden bg-white", ref: minimapContainerRef, onClickCapture: handleClick, onWheelCapture: handleScroll, style: {
@@ -162,108 +447,11 @@ export function MiniMap({ compareView, scroll, pageViewContext, }) {
162
447
  boxShadow: "5px 0 5px -5px var(--color-neutral-grey-100)",
163
448
  }, children: [_jsx("div", { className: "bg-opacity-50 absolute inset-0 overflow-hidden select-none", style: {
164
449
  boxShadow: "var(--color-neutral-grey-15) -10px 1px 13px -10px",
165
- }, children: _jsx("div", { ref: minimapRef, onDragOverCapture: handleClick, className: "h-full w-full", children: _jsx("div", { ref: scaleContainerRef, children: _jsx("iframe", { className: "pointer-events-none", ref: iframeRef, sandbox: "", srcDoc: bridgeMinimapHtml, style: {
166
- border: 0,
167
- display: "block",
168
- height: `${minimapMetrics?.documentHeight ?? 0}px`,
169
- visibility: minimapReady ? "visible" : "hidden",
170
- width: `${minimapMetrics?.viewportWidth ?? 0}px`,
171
- } }) }) }) }), _jsx("div", { "aria-hidden": "true", className: "absolute inset-0" }), viewportHighlight && minimapReady && (_jsx("div", { "data-testid": "minimap-viewport-highlight", className: "bg-neutral-grey-10 pointer-events-none absolute w-full opacity-60 hover:opacity-65", style: {
172
- top: viewportHighlight.top + "px",
173
- height: viewportHighlight.height + "px",
174
- } })), iframeRef.current && (_jsxs(IframeOverlayProvider, { iframe: iframeRef.current, mode: "static", scrollScale: 1, visualScale: scale, children: [editContext.mode === "edit" && (_jsx(PlaceholderDropZones, { size: "small", pageViewContext: pageViewContext })), _jsx(FieldEditedIndicators, { pageViewContext: pageViewContext }), editContext.showComments && (_jsx(CommentHighlightings, { pageViewContext: pageViewContext, variant: "minimap" })), editContext.showSuggestedEdits && (_jsx(SuggestionHighlightings, { pageViewContext: pageViewContext, variant: "minimap" })), editContext.showVersionDiffHighlighting && !compareView && (_jsx(VersionDiffHighlightings, { pageViewContext: pageViewContext, variant: "minimap" }))] }))] }));
175
- }
176
- function getBridgeMinimapMetrics(snapshot, fallbackViewport, scrollOverride) {
177
- if (!snapshot)
178
- return null;
179
- const viewportWidth = snapshot.viewport.width || fallbackViewport.width || 0;
180
- const viewportHeight = snapshot.viewport.height || fallbackViewport.height || 0;
181
- const scrollTop = Math.max(0, scrollOverride ?? snapshot.scroll?.y ?? 0);
182
- const documentHeight = Math.max(viewportHeight, scrollTop + viewportHeight, snapshot.scrollHeight || 0);
183
- if (!viewportWidth || !documentHeight)
184
- return null;
185
- return {
186
- viewportWidth,
187
- viewportHeight,
188
- documentHeight,
189
- scrollTop,
190
- };
191
- }
192
- function getMinimapViewportHighlight(metrics, scale) {
193
- const scaledDocumentHeight = metrics.documentHeight * scale;
194
- const viewportHeight = Math.min(metrics.viewportHeight, metrics.documentHeight);
195
- const maxScrollTop = Math.max(0, metrics.documentHeight - viewportHeight);
196
- const top = Math.min(maxScrollTop, Math.max(0, metrics.scrollTop)) * scale;
197
- const height = Math.min(viewportHeight * scale, Math.max(0, scaledDocumentHeight - top));
198
- return { top, height };
199
- }
200
- function createBridgeMinimapHtml(html, geometry, viewportWidth) {
201
- if (typeof DOMParser === "undefined")
202
- return html;
203
- try {
204
- const doc = new DOMParser().parseFromString(html, "text/html");
205
- constrainBridgeMinimapWidth(doc, viewportWidth);
206
- if (geometry) {
207
- bakeBridgeGeometryDimensions(doc, geometry);
208
- }
209
- return `<!DOCTYPE html>${doc.documentElement.outerHTML}`;
210
- }
211
- catch {
212
- return html;
213
- }
214
- }
215
- function constrainBridgeMinimapWidth(doc, viewportWidth) {
216
- if (!viewportWidth || viewportWidth <= 0)
217
- return;
218
- [doc.documentElement, doc.body].forEach((element) => {
219
- if (!element)
220
- return;
221
- element.style.setProperty("box-sizing", "border-box", "important");
222
- element.style.setProperty("width", `${viewportWidth}px`, "important");
223
- element.style.setProperty("max-width", `${viewportWidth}px`, "important");
224
- element.style.setProperty("overflow-x", "hidden", "important");
225
- });
226
- }
227
- function bakeBridgeGeometryDimensions(doc, geometry) {
228
- const keyedElements = Array.from(doc.querySelectorAll("[data-parhelia-element-key]"));
229
- const componentElements = Array.from(doc.querySelectorAll("[data-component-id], [data-component-start], [data-renderingid], [data-rendering-id]"));
230
- const fieldElements = Array.from(doc.querySelectorAll("[data-fieldid]"));
231
- geometry.targets.forEach((target) => {
232
- if (!target.rect || (target.rect.width <= 0 && target.rect.height <= 0)) {
233
- return;
234
- }
235
- let element;
236
- if (target.elementKey) {
237
- const elementKey = normalizeBridgeKey(target.elementKey);
238
- element = keyedElements.find((candidate) => normalizeBridgeKey(candidate.getAttribute("data-parhelia-element-key")) === elementKey);
239
- }
240
- if (!element && target.kind === "component") {
241
- const componentKey = normalizeBridgeKey(target.componentId || target.key);
242
- element = componentElements.find((candidate) => normalizeBridgeKey(candidate.getAttribute("data-component-id") ||
243
- candidate.getAttribute("data-component-start") ||
244
- candidate.getAttribute("data-renderingid") ||
245
- candidate.getAttribute("data-rendering-id")) === componentKey);
246
- }
247
- else if (target.kind === "field") {
248
- const fieldKey = normalizeBridgeKey(target.fieldId || target.key);
249
- element = fieldElements.find((candidate) => normalizeBridgeKey(candidate.getAttribute("data-fieldid")) ===
250
- fieldKey);
251
- }
252
- if (!element)
253
- return;
254
- if (target.kind === "field" || target.kind === "textRange")
255
- return;
256
- if (target.rect.width > 0) {
257
- element.style.setProperty("width", `${target.rect.width}px`, "important");
258
- element.style.setProperty("min-width", `${target.rect.width}px`, "important");
259
- }
260
- if (target.rect.height > 0) {
261
- element.style.setProperty("height", `${target.rect.height}px`, "important");
262
- element.style.setProperty("min-height", `${target.rect.height}px`, "important");
263
- }
264
- });
265
- }
266
- function normalizeBridgeKey(value) {
267
- return (value || "").replace(/[{}-]/g, "").toLowerCase();
450
+ }, children: _jsx("div", { ref: minimapRef, onDragOverCapture: handleClick, className: "h-full w-full", children: _jsx("div", { ref: scaleContainerRef, children: _jsx("iframe", { className: "pointer-events-none", ref: iframeRef, style: { visibility: minimapReady ? "visible" : "hidden" } }) }) }) }), _jsx("div", { "aria-hidden": "true", className: "absolute inset-0" }), scrollTop !== undefined &&
451
+ scrollHeight !== undefined &&
452
+ minimapReady && (_jsx("div", { className: "bg-neutral-grey-10 pointer-events-none absolute w-full opacity-60 hover:opacity-65", style: {
453
+ top: scrollTop * scale + "px",
454
+ height: viewport.height * scale + "px",
455
+ } })), iframeRef.current && (_jsxs(IframeOverlayProvider, { iframe: iframeRef.current, mode: "static", scrollScale: 1, visualScale: scale, children: [editContext.mode === "edit" && (_jsx(PlaceholderDropZones, { iframe: iframeRef.current, size: "small", pageViewContext: pageViewContext })), _jsx(FieldEditedIndicators, { pageViewContext: pageViewContext }), editContext.showComments && (_jsx(CommentHighlightings, { iframe: iframeRef.current })), editContext.showSuggestedEdits && (_jsx(SuggestionHighlightings, { iframe: iframeRef.current })), editContext.showVersionDiffHighlighting && !compareView && (_jsx(VersionDiffHighlightings, { iframe: iframeRef.current, pageViewContext: pageViewContext, variant: "minimap" }))] }))] }));
268
456
  }
269
457
  //# sourceMappingURL=MiniMap.js.map