@parhelia/core 0.1.12880 → 0.1.12881

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 (291) hide show
  1. package/dist/components/ui/card.d.ts +3 -1
  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 +6 -5
  6. package/dist/config/config.js.map +1 -1
  7. package/dist/config/types.d.ts +0 -7
  8. package/dist/config/types.js.map +1 -1
  9. package/dist/editor/FieldActionsOverlay.d.ts +0 -1
  10. package/dist/editor/FieldActionsOverlay.js +1 -45
  11. package/dist/editor/FieldActionsOverlay.js.map +1 -1
  12. package/dist/editor/FieldListField.d.ts +1 -1
  13. package/dist/editor/FieldListField.js +20 -18
  14. package/dist/editor/FieldListField.js.map +1 -1
  15. package/dist/editor/ImageEditor.d.ts +6 -1
  16. package/dist/editor/ImageEditor.js +19 -3
  17. package/dist/editor/ImageEditor.js.map +1 -1
  18. package/dist/editor/PictureEditor.d.ts +2 -1
  19. package/dist/editor/PictureEditor.js +5 -14
  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 +1 -11
  24. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  25. package/dist/editor/ai/InlineAiDialog.js +22 -11
  26. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  27. package/dist/editor/ai/InlineAiTrigger.js +17 -57
  28. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  29. package/dist/editor/ai/dialogs/capturePageDom.js +66 -36
  30. package/dist/editor/ai/dialogs/capturePageDom.js.map +1 -1
  31. package/dist/editor/ai/dialogs/capturePageScreenshot.js +281 -162
  32. package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
  33. package/dist/editor/ai/terminal/agentSessionState.d.ts +3 -0
  34. package/dist/editor/ai/terminal/agentSessionState.js +3 -1
  35. package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
  36. package/dist/editor/ai/terminal/agentStartRequest.d.ts +2 -1
  37. package/dist/editor/ai/terminal/agentStartRequest.js +2 -1
  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 +7 -0
  42. package/dist/editor/ai/terminal/components/AgentDocumentList.js +55 -13
  43. package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
  44. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +5 -0
  45. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +12 -0
  46. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +1 -0
  47. package/dist/editor/ai/terminal/components/AgentFullPromptControls.d.ts +3 -1
  48. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +22 -14
  49. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
  50. package/dist/editor/ai/terminal/components/AgentModeSelector.js +4 -4
  51. package/dist/editor/ai/terminal/components/AgentModeSelector.js.map +1 -1
  52. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +4 -4
  53. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
  54. package/dist/editor/ai/terminal/components/AgentPromptComposer.js +1 -1
  55. package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
  56. package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +2 -1
  57. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +8 -11
  58. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
  59. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.d.ts +1 -4
  60. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +31 -14
  61. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
  62. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js +1 -1
  63. package/dist/editor/ai/terminal/components/AgentSettingsPopover.js.map +1 -1
  64. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +2 -1
  65. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +2 -4
  66. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
  67. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js +1 -1
  68. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js.map +1 -1
  69. package/dist/editor/ai/terminal/components/AgentTerminalView.js +13 -2
  70. package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
  71. package/dist/editor/ai/terminal/components/AiResponseMessage.js +16 -14
  72. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  73. package/dist/editor/ai/terminal/components/ContextInfoBar.js +22 -2
  74. package/dist/editor/ai/terminal/components/ContextInfoBar.js.map +1 -1
  75. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js +37 -26
  76. package/dist/editor/ai/terminal/components/QueuedPromptsPanel.js.map +1 -1
  77. package/dist/editor/ai/terminal/components/UserMessage.d.ts +2 -1
  78. package/dist/editor/ai/terminal/components/UserMessage.js +144 -8
  79. package/dist/editor/ai/terminal/components/UserMessage.js.map +1 -1
  80. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js +1 -1
  81. package/dist/editor/ai/terminal/useAgentPromptComposerHandlers.js.map +1 -1
  82. package/dist/editor/ai/terminal/useAgentSessionSync.d.ts +1 -0
  83. package/dist/editor/ai/terminal/useAgentSubmitHandlers.d.ts +3 -1
  84. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +9 -3
  85. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
  86. package/dist/editor/ai/terminal/useAgentTerminalController.js +7 -0
  87. package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
  88. package/dist/editor/ai/terminal/useAgentTerminalUiState.js +1 -1
  89. package/dist/editor/ai/terminal/useAgentTerminalUiState.js.map +1 -1
  90. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js +3 -1
  91. package/dist/editor/ai/terminal/useAgentUserMessageSocketHandler.js.map +1 -1
  92. package/dist/editor/ai/useInlineAiPosition.d.ts +1 -1
  93. package/dist/editor/ai/useInlineAiPosition.js +22 -52
  94. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  95. package/dist/editor/ai-image-editor/AiImageResultOverlay.js +30 -62
  96. package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
  97. package/dist/editor/bridge/BridgeClient.d.ts +80 -0
  98. package/dist/editor/bridge/BridgeClient.js +417 -0
  99. package/dist/editor/bridge/BridgeClient.js.map +1 -0
  100. package/dist/editor/client/EditorShell.d.ts +5 -1
  101. package/dist/editor/client/EditorShell.js +282 -126
  102. package/dist/editor/client/EditorShell.js.map +1 -1
  103. package/dist/editor/client/editContext.d.ts +33 -5
  104. package/dist/editor/client/editContext.js.map +1 -1
  105. package/dist/editor/client/hooks/useSocketMessageHandler.js +14 -17
  106. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  107. package/dist/editor/client/itemsRepository.d.ts +2 -0
  108. package/dist/editor/client/itemsRepository.js +15 -8
  109. package/dist/editor/client/itemsRepository.js.map +1 -1
  110. package/dist/editor/client/operations.d.ts +1 -1
  111. package/dist/editor/client/operations.js +41 -17
  112. package/dist/editor/client/operations.js.map +1 -1
  113. package/dist/editor/client/pageModelBuilder.js +24 -7
  114. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  115. package/dist/editor/field-types/MultiLineText.js +10 -3
  116. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  117. package/dist/editor/field-types/RawEditor.js +8 -1
  118. package/dist/editor/field-types/RawEditor.js.map +1 -1
  119. package/dist/editor/field-types/RichTextEditorComponent.js +156 -45
  120. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  121. package/dist/editor/field-types/SingleLineText.js +10 -3
  122. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  123. package/dist/editor/field-types/richtext/components/ReactSlate.js +8 -2
  124. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  125. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +1 -2
  126. package/dist/editor/field-types/richtext/contextMenuFactory.js +100 -303
  127. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  128. package/dist/editor/field-types/richtext/types.d.ts +2 -0
  129. package/dist/editor/field-types/richtext/types.js.map +1 -1
  130. package/dist/editor/field-types/useFormFieldCaretPresence.d.ts +13 -0
  131. package/dist/editor/field-types/useFormFieldCaretPresence.js +92 -0
  132. package/dist/editor/field-types/useFormFieldCaretPresence.js.map +1 -0
  133. package/dist/editor/media-selector/TreeSelector.js +15 -15
  134. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  135. package/dist/editor/menubar/PageSelector.js +8 -2
  136. package/dist/editor/menubar/PageSelector.js.map +1 -1
  137. package/dist/editor/menubar/VersionPreviewCard.js +4 -249
  138. package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
  139. package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
  140. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  141. package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +0 -10
  142. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +63 -462
  143. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  144. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +1 -1
  145. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +6 -0
  146. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +123 -0
  147. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +1 -0
  148. package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +5 -2
  149. package/dist/editor/page-editor-chrome/CommentHighlightings.js +340 -215
  150. package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
  151. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.d.ts +5 -1
  152. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js +11 -4
  153. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
  154. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +21 -13
  155. package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
  156. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +23 -29
  157. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
  158. package/dist/editor/page-editor-chrome/FrameMenu.js +110 -19
  159. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  160. package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +3 -2
  161. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +148 -45
  162. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
  163. package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +2 -0
  164. package/dist/editor/page-editor-chrome/PageEditorChrome.js +25 -21
  165. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
  166. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +163 -128
  167. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
  168. package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +1 -1
  169. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +6 -3
  170. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  171. package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +1 -2
  172. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +83 -146
  173. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  174. package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +5 -2
  175. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +144 -63
  176. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
  177. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +1 -2
  178. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +101 -30
  179. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
  180. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +10 -1
  181. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +105 -122
  182. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
  183. package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +11 -4
  184. package/dist/editor/page-editor-chrome/overlay/geometry.js +139 -36
  185. package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
  186. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +26 -0
  187. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +222 -0
  188. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +1 -0
  189. package/dist/editor/page-viewer/EditorForm.js +17 -1
  190. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  191. package/dist/editor/page-viewer/MiniMap.d.ts +2 -2
  192. package/dist/editor/page-viewer/MiniMap.js +176 -364
  193. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  194. package/dist/editor/page-viewer/PageViewer.js +40 -13
  195. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  196. package/dist/editor/page-viewer/PageViewerFrame.d.ts +0 -5
  197. package/dist/editor/page-viewer/PageViewerFrame.js +1529 -1511
  198. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  199. package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +20 -0
  200. package/dist/editor/page-viewer/bridgeFieldPatch.js +33 -0
  201. package/dist/editor/page-viewer/bridgeFieldPatch.js.map +1 -0
  202. package/dist/editor/page-viewer/pageViewContext.d.ts +32 -0
  203. package/dist/editor/page-viewer/pageViewContext.js +37 -6
  204. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  205. package/dist/editor/reviews/Comment.d.ts +2 -1
  206. package/dist/editor/reviews/Comment.js +9 -4
  207. package/dist/editor/reviews/Comment.js.map +1 -1
  208. package/dist/editor/reviews/CommentEditor.js +1 -1
  209. package/dist/editor/reviews/CommentEditor.js.map +1 -1
  210. package/dist/editor/reviews/CommentPopover.js +68 -9
  211. package/dist/editor/reviews/CommentPopover.js.map +1 -1
  212. package/dist/editor/reviews/CommentView.js +24 -4
  213. package/dist/editor/reviews/CommentView.js.map +1 -1
  214. package/dist/editor/reviews/Comments.d.ts +0 -2
  215. package/dist/editor/reviews/Comments.js +29 -30
  216. package/dist/editor/reviews/Comments.js.map +1 -1
  217. package/dist/editor/reviews/FeedbackCard.d.ts +4 -2
  218. package/dist/editor/reviews/FeedbackCard.js +5 -5
  219. package/dist/editor/reviews/FeedbackCard.js.map +1 -1
  220. package/dist/editor/reviews/SuggestedEdit.js +4 -6
  221. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  222. package/dist/editor/reviews/SuggestionDisplayPopover.js +3 -2
  223. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  224. package/dist/editor/reviews/commentAi.js +96 -27
  225. package/dist/editor/reviews/commentAi.js.map +1 -1
  226. package/dist/editor/reviews/commentTransientSelection.d.ts +23 -0
  227. package/dist/editor/reviews/commentTransientSelection.js +7 -0
  228. package/dist/editor/reviews/commentTransientSelection.js.map +1 -0
  229. package/dist/editor/reviews/feedbackOrdering.d.ts +5 -0
  230. package/dist/editor/reviews/feedbackOrdering.js +27 -0
  231. package/dist/editor/reviews/feedbackOrdering.js.map +1 -0
  232. package/dist/editor/reviews/feedbackSelection.js +32 -4
  233. package/dist/editor/reviews/feedbackSelection.js.map +1 -1
  234. package/dist/editor/reviews/suggestedEditState.d.ts +12 -0
  235. package/dist/editor/reviews/suggestedEditState.js +90 -0
  236. package/dist/editor/reviews/suggestedEditState.js.map +1 -0
  237. package/dist/editor/reviews/suggestionDisplayValue.d.ts +43 -0
  238. package/dist/editor/reviews/suggestionDisplayValue.js +93 -0
  239. package/dist/editor/reviews/suggestionDisplayValue.js.map +1 -0
  240. package/dist/editor/services/agentService.d.ts +15 -0
  241. package/dist/editor/services/agentService.js +11 -1
  242. package/dist/editor/services/agentService.js.map +1 -1
  243. package/dist/editor/services/reviewsService.d.ts +2 -2
  244. package/dist/editor/services/reviewsService.js.map +1 -1
  245. package/dist/editor/settings/SettingsView.js +2 -2
  246. package/dist/editor/settings/SettingsView.js.map +1 -1
  247. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
  248. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  249. package/dist/editor/settings/panels/ProvidersPanel.js +2 -3
  250. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  251. package/dist/editor/sidebar/MorePanelsButton.js +1 -1
  252. package/dist/editor/sidebar/MorePanelsButton.js.map +1 -1
  253. package/dist/editor/sidebar/Workbox.js +1 -1
  254. package/dist/editor/sidebar/Workbox.js.map +1 -1
  255. package/dist/editor/ui/IconSelectorDialog.js +1 -1
  256. package/dist/editor/ui/IconSelectorDialog.js.map +1 -1
  257. package/dist/editor/ui/SimpleIconButton.d.ts +2 -2
  258. package/dist/editor/ui/SimpleIconButton.js +1 -1
  259. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  260. package/dist/editor/utils.d.ts +1 -17
  261. package/dist/editor/utils.js +0 -143
  262. package/dist/editor/utils.js.map +1 -1
  263. package/dist/editor/version-diff/versionDiffTargets.d.ts +3 -8
  264. package/dist/editor/version-diff/versionDiffTargets.js +37 -94
  265. package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
  266. package/dist/revision.d.ts +2 -2
  267. package/dist/revision.js +2 -2
  268. package/dist/splash-screen/DialogWrappers.js +2 -2
  269. package/dist/splash-screen/DialogWrappers.js.map +1 -1
  270. package/dist/splash-screen/ModernSplashScreen.js +11 -3
  271. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  272. package/dist/splash-screen/NewPage.js +7 -5
  273. package/dist/splash-screen/NewPage.js.map +1 -1
  274. package/dist/splash-screen/OpenPage.js +5 -3
  275. package/dist/splash-screen/OpenPage.js.map +1 -1
  276. package/dist/splash-screen/RecentPages.js +3 -3
  277. package/dist/splash-screen/RecentPages.js.map +1 -1
  278. package/package.json +2 -1
  279. package/styles.css +49 -0
  280. package/dist/editor/page-editor-chrome/InlineEditor.d.ts +0 -7
  281. package/dist/editor/page-editor-chrome/InlineEditor.js +0 -1719
  282. package/dist/editor/page-editor-chrome/InlineEditor.js.map +0 -1
  283. package/dist/editor/page-editor-chrome/overlay/iframeAccess.d.ts +0 -2
  284. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js +0 -21
  285. package/dist/editor/page-editor-chrome/overlay/iframeAccess.js.map +0 -1
  286. package/dist/editor/page-editor-chrome/useInlineAICompletion.d.ts +0 -7
  287. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +0 -758
  288. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +0 -1
  289. package/dist/editor/page-viewer/pageModelSkeletonBuilder.d.ts +0 -3
  290. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +0 -796
  291. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +0 -1
@@ -17,60 +17,6 @@ function SvgIcon({ svg, size, className, }) {
17
17
  return (_jsx("span", { className: cn("inline-flex items-center justify-center [&>svg]:block [&>svg]:h-full [&>svg]:w-full", className), style: { width: size, height: size }, dangerouslySetInnerHTML: { __html: sanitizedSvg } }));
18
18
  }
19
19
  const HIGHLIGHT_DURATION_MS = 2000;
20
- const EDITOR_FORM_SLIDER_SELECTOR = '[data-testid="editor-form-slider"]';
21
- const EDITOR_FORM_HIDDEN_ATTRIBUTE = "aria-hidden";
22
- const CLOSE_PANE_LABEL = "Close pane";
23
- function waitForDelay(delayMs) {
24
- return new Promise((resolve) => {
25
- window.setTimeout(resolve, delayMs);
26
- });
27
- }
28
- function getEditorFormSlider(elements = []) {
29
- for (const element of elements) {
30
- const slider = element.closest(EDITOR_FORM_SLIDER_SELECTOR);
31
- if (slider) {
32
- return slider;
33
- }
34
- }
35
- return document.querySelector(EDITOR_FORM_SLIDER_SELECTOR);
36
- }
37
- function isEditorFormSliderHidden(slider) {
38
- return slider?.getAttribute(EDITOR_FORM_HIDDEN_ATTRIBUTE) === "true";
39
- }
40
- async function waitForEditorFormSliderOpen(slider, timeoutMs = 1000) {
41
- const startedAt = Date.now();
42
- while (Date.now() - startedAt < timeoutMs) {
43
- if (!isEditorFormSliderHidden(slider ?? getEditorFormSlider())) {
44
- return;
45
- }
46
- await waitForDelay(50);
47
- }
48
- }
49
- async function waitForResolvedElements(resolveElements, selector, timeoutMs = 1000) {
50
- const startedAt = Date.now();
51
- while (Date.now() - startedAt < timeoutMs) {
52
- const elements = resolveElements(selector);
53
- if (elements.length > 0) {
54
- return elements;
55
- }
56
- await waitForDelay(50);
57
- }
58
- return resolveElements(selector);
59
- }
60
- // Wait until at least one element for the selector is actually VISIBLE (not just
61
- // present). After a reveal/animation a target can be in the DOM but not yet laid
62
- // out, which would otherwise cause highlightElement to skip it.
63
- async function waitForVisibleElements(selector, timeoutMs = 1000) {
64
- const startedAt = Date.now();
65
- while (Date.now() - startedAt < timeoutMs) {
66
- const elements = getVisibleElementsForSelector(selector);
67
- if (elements.length > 0) {
68
- return elements;
69
- }
70
- await waitForDelay(50);
71
- }
72
- return getVisibleElementsForSelector(selector);
73
- }
74
20
  const manualMarkdownComponents = {
75
21
  h1: ({ children }) => (_jsx("h1", { className: "text-neutral-grey-100 mt-4 mb-0 text-xl font-bold", children: children })),
76
22
  h2: ({ children }) => (_jsx("h2", { className: "text-neutral-grey-100 mt-3 mb-0 text-lg font-semibold", children: children })),
@@ -106,15 +52,7 @@ export function parseUiSelectors(uiSelectors) {
106
52
  let beforeAction;
107
53
  let afterAction;
108
54
  let availabilitySelector;
109
- let selectorOverride;
110
- let tab;
111
- let closeMode;
112
55
  for (const segment of segments) {
113
- if (segment.startsWith("close=")) {
114
- const value = segment.substring("close=".length).trim();
115
- closeMode = value === "auto" ? "auto" : "click";
116
- continue;
117
- }
118
56
  if (segment.startsWith("beforeAction=")) {
119
57
  beforeAction = segment.substring("beforeAction=".length).trim();
120
58
  continue;
@@ -129,14 +67,6 @@ export function parseUiSelectors(uiSelectors) {
129
67
  .trim();
130
68
  continue;
131
69
  }
132
- if (segment.startsWith("selector=")) {
133
- selectorOverride = segment.substring("selector=".length).trim();
134
- continue;
135
- }
136
- if (segment.startsWith("tab=")) {
137
- tab = segment.substring("tab=".length).trim();
138
- continue;
139
- }
140
70
  if (!notFoundMessage) {
141
71
  notFoundMessage = segment;
142
72
  }
@@ -150,16 +80,14 @@ export function parseUiSelectors(uiSelectors) {
150
80
  : undefined;
151
81
  const parsed = {
152
82
  name,
153
- selector: isSidebarOnly ? "" : selectorOverride || `@${name}`,
83
+ selector: isSidebarOnly ? "" : `@${name}`, // Empty selector for sidebar-only
154
84
  availabilitySelector,
155
- tab,
156
85
  description,
157
86
  notFoundMessage: notFoundMessage || undefined,
158
87
  location: isSidebarOnly ? sidebarId : undefined, // Use actual sidebar ID (without -sidebar suffix) for sidebar-only
159
88
  isSidebarOnly,
160
89
  beforeAction,
161
90
  afterAction,
162
- closeMode,
163
91
  };
164
92
  // Primary key remains the selector name
165
93
  map.set(name, parsed);
@@ -171,7 +99,8 @@ function parseSelectorToken(selectorToken) {
171
99
  if (!selectorToken.startsWith("@"))
172
100
  return { selector: selectorToken };
173
101
  const raw = selectorToken.slice(1);
174
- // Preserve iframe: selectors (handled specially by expandSelector/highlightElement)
102
+ // Preserve iframe: selectors as unavailable selectors. Page DOM inspection now
103
+ // goes through the editing bridge instead of same-origin iframe probing.
175
104
  if (raw.startsWith("iframe:"))
176
105
  return { selector: selectorToken };
177
106
  // Check for sidebar-only syntax: @sidebar-id-sidebar (e.g., @reviews-sidebar)
@@ -207,7 +136,6 @@ export function expandSelector(selectorShorthand) {
207
136
  return selector;
208
137
  }
209
138
  if (selector.startsWith("iframe:")) {
210
- // Iframe selector: @iframe:selector → iframe:selector (handled by GuidanceOverlay)
211
139
  return selector;
212
140
  }
213
141
  // Default: data-testid selector: @name → [data-testid="name"]
@@ -216,55 +144,10 @@ export function expandSelector(selectorShorthand) {
216
144
  function getElementsForSelector(selector) {
217
145
  const cssSelector = expandSelector(selector);
218
146
  if (cssSelector.startsWith("iframe:")) {
219
- const iframeSelector = cssSelector.substring(7);
220
- const iframe = document.querySelector("iframe.page-iframe");
221
- if (!iframe?.contentDocument) {
222
- return [];
223
- }
224
- return Array.from(iframe.contentDocument.querySelectorAll(iframeSelector));
147
+ return [];
225
148
  }
226
149
  return Array.from(document.querySelectorAll(cssSelector));
227
150
  }
228
- // Determine whether an element is genuinely visible to the user, not merely
229
- // present in the DOM. A target sitting inside a collapsed panel, a hidden
230
- // sidebar (aria-hidden), or with `display:none` / `visibility:hidden` / zero
231
- // size counts as NOT visible.
232
- function isElementVisible(element) {
233
- // Treat anything inside an explicitly aria-hidden container (e.g. a collapsed
234
- // editor form slider) as not visible.
235
- if (element.closest('[aria-hidden="true"]')) {
236
- return false;
237
- }
238
- const candidate = element;
239
- if (typeof candidate.checkVisibility === "function") {
240
- if (!candidate.checkVisibility({
241
- checkOpacity: true,
242
- checkVisibilityCSS: true,
243
- })) {
244
- return false;
245
- }
246
- }
247
- else {
248
- // Fallback for environments without Element.checkVisibility (e.g. jsdom).
249
- const style = window.getComputedStyle(element);
250
- if (style.display === "none" ||
251
- style.visibility === "hidden" ||
252
- style.visibility === "collapse") {
253
- return false;
254
- }
255
- // position:fixed elements have a null offsetParent but can still be visible.
256
- if (element.offsetParent === null && style.position !== "fixed") {
257
- return false;
258
- }
259
- }
260
- // Reject zero-area elements (e.g. a width:0 collapsed panel).
261
- const rect = element.getBoundingClientRect();
262
- return rect.width > 0 && rect.height > 0;
263
- }
264
- // Return only the elements matching a selector that are currently visible.
265
- function getVisibleElementsForSelector(selector) {
266
- return getElementsForSelector(selector).filter(isElementVisible);
267
- }
268
151
  function shouldSkipHighlightScroll(element) {
269
152
  const rect = element.getBoundingClientRect();
270
153
  const computedStyle = window.getComputedStyle(element);
@@ -302,32 +185,6 @@ async function waitForScrollToFinish(element) {
302
185
  previousRect = currentRect;
303
186
  }
304
187
  }
305
- // Wait until an element's box (position and size) stops changing. This avoids
306
- // drawing the highlight overlay mid-animation (e.g. while a sidebar panel is
307
- // still expanding from its collapsed width).
308
- async function waitForStableRect(element, timeoutMs = 1000) {
309
- let previousRect = element.getBoundingClientRect();
310
- let stableFrames = 0;
311
- const startedAt = Date.now();
312
- while (Date.now() - startedAt < timeoutMs) {
313
- await waitForNextFrame();
314
- const currentRect = element.getBoundingClientRect();
315
- const changed = Math.abs(currentRect.width - previousRect.width) > 0.5 ||
316
- Math.abs(currentRect.height - previousRect.height) > 0.5 ||
317
- Math.abs(currentRect.top - previousRect.top) > 0.5 ||
318
- Math.abs(currentRect.left - previousRect.left) > 0.5;
319
- if (changed) {
320
- stableFrames = 0;
321
- }
322
- else {
323
- stableFrames += 1;
324
- if (stableFrames >= 2) {
325
- return;
326
- }
327
- }
328
- previousRect = currentRect;
329
- }
330
- }
331
188
  async function scrollElementForHighlight(element) {
332
189
  if (shouldSkipHighlightScroll(element)) {
333
190
  return;
@@ -342,57 +199,21 @@ async function scrollElementForHighlight(element) {
342
199
  // Highlight an element temporarily
343
200
  export async function highlightElement(selector, duration = HIGHLIGHT_DURATION_MS) {
344
201
  const cssSelector = expandSelector(selector);
345
- // Only ever highlight elements that are actually visible. A target inside a
346
- // collapsed panel or hidden sidebar must not receive a stray overlay.
347
- const elements = getElementsForSelector(selector).filter(isElementVisible);
202
+ const elements = getElementsForSelector(selector);
348
203
  if (elements.length === 0)
349
204
  return;
350
- if (cssSelector.startsWith("iframe:")) {
351
- const iframe = document.querySelector("iframe.page-iframe");
352
- const iframeRect = iframe?.getBoundingClientRect();
353
- if (elements[0]) {
354
- await scrollElementForHighlight(elements[0]);
355
- await waitForStableRect(elements[0]);
356
- }
357
- elements.forEach((element) => {
358
- const elementRect = element.getBoundingClientRect();
359
- showHighlightOverlay(elementRect.left + (iframeRect?.left ?? 0), elementRect.top + (iframeRect?.top ?? 0), elementRect.width, elementRect.height, duration);
360
- });
361
- return;
362
- }
363
205
  if (elements[0]) {
364
206
  await scrollElementForHighlight(elements[0]);
365
- await waitForStableRect(elements[0]);
366
207
  }
367
208
  elements.forEach((element) => {
368
209
  const rect = element.getBoundingClientRect();
369
210
  showHighlightOverlay(rect.left, rect.top, rect.width, rect.height, duration);
370
211
  });
371
212
  }
372
- // Check if an element is currently present in the DOM (regardless of visibility)
373
- function isElementPresent(selector) {
213
+ // Check if an element is currently available in the DOM
214
+ function isElementAvailable(selector) {
374
215
  return getElementsForSelector(selector).length > 0;
375
216
  }
376
- // Check if an element matching the selector is currently visible to the user
377
- function isElementVisibleBySelector(selector) {
378
- return getVisibleElementsForSelector(selector).length > 0;
379
- }
380
- export function deriveSelectorState(params) {
381
- if (!params.isAnchorReachable) {
382
- return "disabled";
383
- }
384
- // Sidebar-only selectors have no element to "see"; opening the sidebar is the action.
385
- if (params.isSidebarOnly) {
386
- return "show-action";
387
- }
388
- if (params.isTargetVisible) {
389
- return "show";
390
- }
391
- if (params.hasRevealPath) {
392
- return "show-action";
393
- }
394
- return "disabled";
395
- }
396
217
  // Create a temporary highlight overlay
397
218
  function showHighlightOverlay(x, y, width, height, duration) {
398
219
  const padding = 4;
@@ -444,187 +265,59 @@ function showHighlightOverlay(x, y, width, height, duration) {
444
265
  overlay.remove();
445
266
  }, duration);
446
267
  }
447
- let activeRevealController = null;
448
- let revealControllerSeq = 0;
449
- function registerActiveReveal(controller) {
450
- const previous = activeRevealController;
451
- activeRevealController = controller;
452
- if (previous && previous.id !== controller.id) {
453
- previous.close();
454
- }
455
- }
456
- function clearActiveReveal(id) {
457
- if (activeRevealController?.id === id) {
458
- activeRevealController = null;
459
- }
460
- }
461
- // Close the More-panels flyout if it is currently open (inverse of open-more-sidebars).
462
- function closeMorePanelsIfOpen() {
463
- if (!isElementPresent("@more-sidebars-panel"))
464
- return;
465
- const trigger = document.querySelector('[data-testid="more-sidebars-button"]');
466
- trigger?.click();
467
- }
468
268
  // Button component for "Show me" functionality with availability detection
469
269
  function SelectorButton({ selectorDef, keyProp, }) {
470
270
  const editContext = useEditContext();
471
271
  const manualActions = editContext?.configuration.editor.manualActions;
472
- const isSidebarOnly = !!selectorDef.isSidebarOnly;
473
- const targetSelector = selectorDef.selector;
474
- // Anchor = explicit availabilitySelector only. It gates the disabled state.
475
- const anchorSelector = selectorDef.availabilitySelector;
476
- const hasAvailabilitySelector = Boolean(anchorSelector);
477
- const closeMode = selectorDef.closeMode ?? "click";
478
- // Keep a fresh reference to editContext for use inside reveal/restore closures.
479
- const editContextRef = useRef(editContext);
480
- editContextRef.current = editContext;
272
+ const availabilitySelector = selectorDef.availabilitySelector || selectorDef.selector;
273
+ // For sidebar-only selectors, we don't need to check for an element
274
+ const isSidebarOnly = selectorDef.isSidebarOnly;
275
+ // Initialize to true for sidebar-only, false otherwise to avoid hydration mismatch
276
+ // (document.querySelector doesn't exist during SSR)
277
+ const [isAvailable, setIsAvailable] = useState(isSidebarOnly ? true : false);
278
+ // Can open sidebar if: sidebar-only selector
279
+ const canAutoOpenSidebar = Boolean(isSidebarOnly && editContext?.openSidebar && selectorDef.location);
481
280
  const hasBeforeAction = Boolean(selectorDef.beforeAction &&
482
281
  manualActions?.[selectorDef.beforeAction] &&
483
282
  editContext);
484
- // A sidebar-only selector is reachable only when the current workspace
485
- // supports sidebars and offers this specific sidebar (both are workspace-scoped).
486
- const canAutoOpenSidebar = Boolean(isSidebarOnly &&
487
- selectorDef.location &&
488
- editContext?.openSidebar &&
489
- editContext.workspace?.supportsSidebars &&
490
- editContext.availableSidebars?.some((s) => s.id === selectorDef.location));
491
- // Presence/visibility probes, kept up to date by the effect below.
492
- // The anchor gates "is this relevant in the current context", so it checks
493
- // presence (it may itself be a currently-collapsed container). The target
494
- // checks visibility to distinguish "show" from "show-action".
495
- const [isTargetPresent, setIsTargetPresent] = useState(false);
496
- const [isTargetVisible, setIsTargetVisible] = useState(false);
497
- const [isAnchorPresent, setIsAnchorPresent] = useState(false);
498
- // True while THIS button has revealed a container (State 3 active -> green).
499
- const [isActiveReveal, setIsActiveReveal] = useState(false);
500
- const controllerIdRef = useRef(0);
501
- const revealRef = useRef(null);
502
- const isAnchorReachable = hasAvailabilitySelector
503
- ? isAnchorPresent
504
- : isSidebarOnly
505
- ? canAutoOpenSidebar
506
- : isTargetPresent || hasBeforeAction;
507
- const hasRevealPath = isSidebarOnly || hasBeforeAction || canAutoOpenSidebar || isTargetPresent;
508
- const state = deriveSelectorState({
509
- isSidebarOnly,
510
- isAnchorReachable,
511
- isTargetVisible,
512
- hasRevealPath,
513
- });
514
- const isDisabled = state === "disabled";
515
- // Reset active (green) state WITHOUT running the undo steps. Used when the
516
- // revealed container was closed by some other means.
517
- const resetActiveState = useCallback(() => {
518
- clearActiveReveal(controllerIdRef.current);
519
- revealRef.current = null;
520
- setIsActiveReveal(false);
521
- }, []);
522
- // Run the undo steps and reset. Used for explicit close (2nd click, auto
523
- // timer, or being superseded by another reveal via mutual exclusion).
524
- const runRestore = useCallback(() => {
525
- const reveal = revealRef.current;
526
- if (reveal) {
527
- try {
528
- reveal.restore();
529
- }
530
- catch {
531
- // ignore restore failures
532
- }
533
- }
534
- clearActiveReveal(reveal?.id ?? controllerIdRef.current);
535
- revealRef.current = null;
536
- setIsActiveReveal(false);
537
- }, []);
538
- const runRestoreRef = useRef(runRestore);
539
- runRestoreRef.current = runRestore;
540
- // Keep the presence/visibility probes fresh.
283
+ const isActionable = isSidebarOnly
284
+ ? canAutoOpenSidebar || hasBeforeAction
285
+ : isAvailable || canAutoOpenSidebar || hasBeforeAction;
286
+ // Monitor for element availability changes (skip for sidebar-only selectors)
541
287
  useEffect(() => {
542
- const check = () => {
543
- setIsTargetPresent(targetSelector ? isElementPresent(targetSelector) : false);
544
- setIsTargetVisible(targetSelector ? isElementVisibleBySelector(targetSelector) : false);
545
- setIsAnchorPresent(anchorSelector ? isElementPresent(anchorSelector) : false);
546
- };
547
- check();
548
- const attributeFilter = [
549
- "data-testid",
550
- "class",
551
- "id",
552
- "style",
553
- "hidden",
554
- "aria-hidden",
555
- ];
556
- const observer = new MutationObserver(check);
557
- observer.observe(document.body, {
558
- childList: true,
559
- subtree: true,
560
- attributes: true,
561
- attributeFilter,
562
- });
563
- let iframeObserver = null;
564
- const iframe = document.querySelector("iframe.page-iframe");
565
- if (iframe?.contentDocument?.body) {
566
- iframeObserver = new MutationObserver(check);
567
- iframeObserver.observe(iframe.contentDocument.body, {
568
- childList: true,
569
- subtree: true,
570
- attributes: true,
571
- attributeFilter,
572
- });
573
- }
574
- const intervalId = setInterval(check, 1000);
575
- return () => {
576
- observer.disconnect();
577
- iframeObserver?.disconnect();
578
- clearInterval(intervalId);
579
- };
580
- }, [targetSelector, anchorSelector]);
581
- // While active, detect if the revealed container was closed externally and
582
- // reset the button's active (green) state accordingly.
583
- useEffect(() => {
584
- if (!isActiveReveal)
288
+ // Sidebar-only selectors are always "available" if openSidebar exists
289
+ if (isSidebarOnly) {
290
+ setIsAvailable(true);
585
291
  return;
586
- const check = () => {
587
- const reveal = revealRef.current;
588
- if (!reveal || !reveal.isStillOpen()) {
589
- resetActiveState();
590
- }
292
+ }
293
+ // Initial check
294
+ const initialAvailable = isElementAvailable(availabilitySelector);
295
+ setIsAvailable(initialAvailable);
296
+ // Set up MutationObserver to watch for DOM changes
297
+ const checkAvailability = () => {
298
+ const available = isElementAvailable(availabilitySelector);
299
+ setIsAvailable(available);
591
300
  };
592
- const observer = new MutationObserver(check);
301
+ // Watch the main document for changes
302
+ const observer = new MutationObserver(checkAvailability);
593
303
  observer.observe(document.body, {
594
304
  childList: true,
595
305
  subtree: true,
596
306
  attributes: true,
597
- attributeFilter: [
598
- EDITOR_FORM_HIDDEN_ATTRIBUTE,
599
- "class",
600
- "style",
601
- "data-testid",
602
- ],
307
+ attributeFilter: ["data-testid", "class", "id"],
603
308
  });
604
- const intervalId = setInterval(check, 500);
309
+ // Also poll periodically as a fallback for async UI updates.
310
+ const intervalId = setInterval(checkAvailability, 1000);
605
311
  return () => {
606
312
  observer.disconnect();
607
313
  clearInterval(intervalId);
608
314
  };
609
- }, [isActiveReveal, resetActiveState]);
610
- // Clear the global active controller if this button unmounts while active.
611
- useEffect(() => {
612
- return () => {
613
- clearActiveReveal(controllerIdRef.current);
614
- };
615
- }, []);
616
- const tooltipText = isActiveReveal
617
- ? CLOSE_PANE_LABEL
618
- : isDisabled
619
- ? selectorDef.notFoundMessage || selectorDef.description
620
- : selectorDef.description;
621
- return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { "aria-label": isActiveReveal ? CLOSE_PANE_LABEL : "Show me", onClick: async () => {
622
- // Second click while active -> restore (close=click behaviour).
623
- if (isActiveReveal) {
624
- runRestore();
625
- return;
626
- }
627
- if (isDisabled)
315
+ }, [availabilitySelector, isSidebarOnly]);
316
+ const tooltipText = isActionable
317
+ ? selectorDef.description
318
+ : selectorDef.notFoundMessage || selectorDef.description;
319
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { "aria-label": "Show me", onClick: async () => {
320
+ if (!isActionable)
628
321
  return;
629
322
  const runId = globalThis.crypto?.randomUUID?.() ??
630
323
  `manual-${Date.now()}-${Math.random().toString(36).slice(2)}`;
@@ -644,126 +337,34 @@ function SelectorButton({ selectorDef, keyProp, }) {
644
337
  };
645
338
  await action(actionProps);
646
339
  };
647
- // Undo steps captured as we reveal, plus predicates telling whether
648
- // the revealed container is still open.
649
- const undoSteps = [];
650
- const openPredicates = [];
651
- // 1. Sidebar-only: open the sidebar.
652
- if (isSidebarOnly &&
340
+ // If this selector is sidebar-only, open the sidebar before highlighting.
341
+ // For sidebar-only selectors, location is the sidebar ID (without -sidebar suffix)
342
+ if (selectorDef.isSidebarOnly &&
653
343
  editContext?.openSidebar &&
654
344
  selectorDef.location) {
655
345
  const sidebarId = selectorDef.location;
656
- const wasOpen = !!editContext.openSidebars?.includes(sidebarId);
657
- if (!wasOpen) {
346
+ const isSidebarAlreadyOpen = !!editContext.openSidebars?.includes(sidebarId);
347
+ if (!isSidebarAlreadyOpen) {
658
348
  editContext.openSidebar(sidebarId);
659
- undoSteps.push(() => editContextRef.current?.toggleSidebar?.(sidebarId, {
660
- forceClose: true,
661
- }));
662
- // Give the sidebar a moment to render before querying.
349
+ // Give the sidebar a moment to render before querying/highlighting.
663
350
  await new Promise((resolve) => setTimeout(resolve, 150));
664
351
  }
665
- openPredicates.push(() => !!editContextRef.current?.openSidebars?.includes(sidebarId));
666
- }
667
- const availabilityElements = anchorSelector
668
- ? resolveElements(anchorSelector)
669
- : [];
670
- const relevantElements = !isSidebarOnly
671
- ? [...resolveElements(), ...availabilityElements]
672
- : availabilityElements;
673
- const formSlider = getEditorFormSlider(relevantElements);
674
- const shouldOpenEditorForm = !isSidebarOnly &&
675
- !!formSlider &&
676
- isEditorFormSliderHidden(formSlider);
677
- if (selectorDef.tab) {
678
- editContext?.setActiveEditorTab(selectorDef.tab);
679
- }
680
- // 2. Editor form slider.
681
- if (shouldOpenEditorForm && editContext) {
682
- const slotId = editContext.getActiveSlotId();
683
- editContext.setEditorFormHiddenForSlot(slotId, false);
684
- undoSteps.push(() => editContextRef.current?.setEditorFormHiddenForSlot(slotId, true));
685
- openPredicates.push(() => !isEditorFormSliderHidden(getEditorFormSlider()));
686
- await waitForEditorFormSliderOpen(formSlider);
687
- }
688
- else if (selectorDef.tab) {
689
- await waitForNextFrame();
690
352
  }
691
- // 3. beforeAction (may open the More-panels flyout, reveal fields, etc.).
692
- const resolvedElements = !isSidebarOnly
693
- ? await waitForResolvedElements(resolveElements, selectorDef.selector)
694
- : [];
695
- const actionElements = resolvedElements.length > 0
696
- ? resolvedElements
697
- : availabilityElements;
698
- const morePanelsWasOpen = isElementPresent("@more-sidebars-panel");
699
- await runManualAction(selectorDef.beforeAction, actionElements);
700
- if (selectorDef.beforeAction === "open-more-sidebars") {
701
- const morePanelsNowOpen = isElementPresent("@more-sidebars-panel");
702
- if (!morePanelsWasOpen && morePanelsNowOpen) {
703
- undoSteps.push(() => closeMorePanelsIfOpen());
704
- openPredicates.push(() => isElementPresent("@more-sidebars-panel"));
705
- }
353
+ const resolvedElements = !isSidebarOnly ? resolveElements() : [];
354
+ await runManualAction(selectorDef.beforeAction, resolvedElements);
355
+ // For sidebar-only selectors, we just open the sidebar (done above)
356
+ // For regular selectors, also highlight the element
357
+ if (!isSidebarOnly && selectorDef.selector) {
358
+ await highlightElement(selectorDef.selector, HIGHLIGHT_DURATION_MS);
706
359
  }
707
- // afterAction is the declared inverse for custom reveals (e.g. field actions).
708
360
  if (selectorDef.afterAction) {
709
- undoSteps.push(() => {
710
- void runManualAction(selectorDef.afterAction, !isSidebarOnly ? resolveElements() : availabilityElements);
711
- });
712
- }
713
- // Highlight the target. For sidebar-only selectors there is no inner
714
- // target, so we highlight the opened sidebar panel itself. Wait for
715
- // it to become visible first, since a just-revealed element may be
716
- // present but not yet laid out (highlightElement skips invisible ones).
717
- const highlightSelector = isSidebarOnly
718
- ? selectorDef.location
719
- ? `@sidebar-panel-${selectorDef.location}`
720
- : ""
721
- : selectorDef.selector;
722
- if (highlightSelector) {
723
- const highlightTargets = await waitForVisibleElements(highlightSelector, 1500);
724
- if (highlightTargets.length > 0) {
725
- await highlightElement(highlightSelector, HIGHLIGHT_DURATION_MS);
726
- }
727
- }
728
- // If we opened/undid anything, this was a State-3 reveal: keep the
729
- // button active (green) and register it for mutual exclusion.
730
- if (undoSteps.length > 0) {
731
- const id = ++revealControllerSeq;
732
- controllerIdRef.current = id;
733
- revealRef.current = {
734
- id,
735
- restore: () => {
736
- for (let i = undoSteps.length - 1; i >= 0; i -= 1) {
737
- try {
738
- undoSteps[i]?.();
739
- }
740
- catch {
741
- // ignore individual undo failures
742
- }
743
- }
744
- },
745
- isStillOpen: () => openPredicates.length === 0
746
- ? true
747
- : openPredicates.some((predicate) => predicate()),
748
- };
749
- registerActiveReveal({
750
- id,
751
- close: () => runRestoreRef.current(),
752
- });
753
- setIsActiveReveal(true);
754
- if (closeMode === "auto") {
755
- window.setTimeout(() => {
756
- if (controllerIdRef.current === id) {
757
- runRestoreRef.current();
758
- }
759
- }, HIGHLIGHT_DURATION_MS);
760
- }
361
+ window.setTimeout(() => {
362
+ void runManualAction(selectorDef.afterAction, !isSidebarOnly ? resolveElements() : []);
363
+ }, HIGHLIGHT_DURATION_MS);
761
364
  }
762
- }, disabled: isDisabled && !isActiveReveal, className: cn("inline-flex h-5 w-5 items-center justify-center rounded border transition-colors", isActiveReveal
763
- ? "border-feedback-green bg-feedback-green-light text-feedback-green hover:bg-feedback-green-light cursor-pointer"
764
- : !isDisabled
765
- ? "border-feedback-blue bg-feedback-blue-light text-feedback-blue hover:bg-feedback-blue-light cursor-pointer"
766
- : "border-border-default bg-neutral-grey-5 text-neutral-grey-50 cursor-not-allowed"), children: [_jsx(LocateFixed, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), _jsx("span", { className: "sr-only", children: "Show me" })] }, keyProp) }), _jsx(TooltipContent, { children: tooltipText })] }));
365
+ }, disabled: !isActionable, className: cn("inline-flex h-5 w-5 items-center justify-center rounded border transition-colors", isActionable
366
+ ? "border-feedback-blue bg-feedback-blue-light text-feedback-blue hover:bg-feedback-blue-light cursor-pointer"
367
+ : "border-border-default bg-neutral-grey-5 text-neutral-grey-50 cursor-not-allowed"), children: [_jsx(LocateFixed, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), _jsx("span", { className: "sr-only", children: "Show me" })] }, keyProp) }), _jsx(TooltipContent, { children: tooltipText })] }));
767
368
  }
768
369
  // Render markdown content with clickable selectors
769
370
  // Supports both {{selectorName}} syntax (looks up in uiSelectors) and legacy @selector syntax
@@ -806,10 +407,10 @@ function renderLineWithSelectors(text, uiSelectors, manualLinkTargets, onManualL
806
407
  function renderInlineSelectorsAndFormatting(text, uiSelectors) {
807
408
  const parts = [];
808
409
  let lastIndex = 0;
809
- // Combined regex for {{namedSelector}}, @selector, and **bold**
810
- // Note: @selector can include -sidebar suffix for sidebar-only selectors
811
- // Also supports @iframe:selector syntax (iframe: is special and allowed)
812
- // Now also matches optional parentheses around selectors: ({{name}}) or (@selector)
410
+ // Combined regex for {{namedSelector}}, @selector, and **bold**.
411
+ // @selector can include -sidebar suffix for sidebar-only selectors.
412
+ // The matcher keeps legacy @iframe: tokens parseable, but they are unavailable.
413
+ // Also matches optional parentheses around selectors: ({{name}}) or (@selector).
813
414
  const regex = /(\()?(\{\{([\w\-]+)\}\})|(\()?(@(?:iframe:[\w\-\.#\[\]=]*[\w\-#\[\]=]|[\w\-\.#\[\]=]*[\w\-#\[\]=]))|(\*\*(.+?)\*\*)/g;
814
415
  let match;
815
416
  while ((match = regex.exec(text)) !== null) {