@parhelia/core 0.3.12771 → 0.3.12777

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 (557) hide show
  1. package/dist/agents-view/AgentCard.js +1 -5
  2. package/dist/agents-view/AgentCard.js.map +1 -1
  3. package/dist/agents-view/AgentsView.js +1 -1
  4. package/dist/agents-view/AgentsView.js.map +1 -1
  5. package/dist/components/ActionButton.d.ts +7 -0
  6. package/dist/components/ActionButton.js +2 -2
  7. package/dist/components/ActionButton.js.map +1 -1
  8. package/dist/components/MarkdownDisplay.js +1 -1
  9. package/dist/components/ui/CardConnector.js +1 -1
  10. package/dist/components/ui/LanguageSelectionGrid.js +1 -1
  11. package/dist/components/ui/LanguageSelector.js +3 -3
  12. package/dist/components/ui/LanguageSelector.js.map +1 -1
  13. package/dist/components/ui/PlaceholderItemSelector.js +1 -1
  14. package/dist/components/ui/alert.d.ts +1 -1
  15. package/dist/components/ui/button.d.ts +2 -2
  16. package/dist/components/ui/card.js +1 -1
  17. package/dist/components/ui/close-button.d.ts +1 -1
  18. package/dist/components/ui/context-menu.js +1 -1
  19. package/dist/components/ui/copy-button.js +1 -1
  20. package/dist/components/ui/delete-button.d.ts +1 -1
  21. package/dist/components/ui/paste-button.js +1 -1
  22. package/dist/components/ui/popover.d.ts +1 -0
  23. package/dist/components/ui/popover.js +16 -7
  24. package/dist/components/ui/popover.js.map +1 -1
  25. package/dist/components/ui/sonner.js +1 -1
  26. package/dist/components/ui/upload-button.js +1 -1
  27. package/dist/config/config.js +18 -4
  28. package/dist/config/config.js.map +1 -1
  29. package/dist/editor/ConcurrentUserLimitDialog.js +1 -1
  30. package/dist/editor/ContentTree.d.ts +12 -1
  31. package/dist/editor/ContentTree.js +20 -3
  32. package/dist/editor/ContentTree.js.map +1 -1
  33. package/dist/editor/FieldActionsOverlay.js.map +1 -1
  34. package/dist/editor/FieldHistory.d.ts +15 -1
  35. package/dist/editor/FieldHistory.js +85 -52
  36. package/dist/editor/FieldHistory.js.map +1 -1
  37. package/dist/editor/FieldList.js +5 -2
  38. package/dist/editor/FieldList.js.map +1 -1
  39. package/dist/editor/FieldListField.js +7 -2
  40. package/dist/editor/FieldListField.js.map +1 -1
  41. package/dist/editor/FieldListFieldWithFallbacks.js +1 -1
  42. package/dist/editor/GlobalMenuBar.js +1 -1
  43. package/dist/editor/ItemInfo.js +2 -2
  44. package/dist/editor/ItemInfo.js.map +1 -1
  45. package/dist/editor/LinkEditorDialog.js +1 -1
  46. package/dist/editor/MigrationsView.js +1 -1
  47. package/dist/editor/PictureCropper.js +1 -1
  48. package/dist/editor/PictureCropper.js.map +1 -1
  49. package/dist/editor/SetupWizard.js.map +1 -1
  50. package/dist/editor/WorkspaceTitleSwitcher.js +1 -1
  51. package/dist/editor/ai/AgentImageCopyButton.d.ts +6 -0
  52. package/dist/editor/ai/AgentImageCopyButton.js +93 -0
  53. package/dist/editor/ai/AgentImageCopyButton.js.map +1 -0
  54. package/dist/editor/ai/AgentSharingSection.js +1 -1
  55. package/dist/editor/ai/Agents.d.ts +2 -2
  56. package/dist/editor/ai/Agents.js +2 -10
  57. package/dist/editor/ai/Agents.js.map +1 -1
  58. package/dist/editor/ai/GuidanceOverlay.js +1 -1
  59. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  60. package/dist/editor/ai/InlineAiDialog.js +1 -1
  61. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  62. package/dist/editor/ai/InlineAiTrigger.js +1 -1
  63. package/dist/editor/ai/MediaImage.js +2 -1
  64. package/dist/editor/ai/MediaImage.js.map +1 -1
  65. package/dist/editor/ai/agentActivitySummary.js.map +1 -1
  66. package/dist/editor/ai/agentMessageHelpers.js.map +1 -1
  67. package/dist/editor/ai/dialogs/AgentDialogHandler.js +103 -6
  68. package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
  69. package/dist/editor/ai/dialogs/QuestionnaireInline.js +1 -1
  70. package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +21 -0
  71. package/dist/editor/ai/dialogs/agentDialogTypes.js +3 -1
  72. package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
  73. package/dist/editor/ai/terminal/agentCost.d.ts +1 -0
  74. package/dist/editor/ai/terminal/agentCost.js +10 -3
  75. package/dist/editor/ai/terminal/agentCost.js.map +1 -1
  76. package/dist/editor/ai/terminal/agentSessionSelectors.js.map +1 -1
  77. package/dist/editor/ai/terminal/agentSessionState.js +4 -1
  78. package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
  79. package/dist/editor/ai/terminal/components/AgentCostDisplay.d.ts +1 -1
  80. package/dist/editor/ai/terminal/components/AgentCostDisplay.js +3 -3
  81. package/dist/editor/ai/terminal/components/AgentCostDisplay.js.map +1 -1
  82. package/dist/editor/ai/terminal/components/AgentDocumentList.js +2 -2
  83. package/dist/editor/ai/terminal/components/AgentDocumentList.js.map +1 -1
  84. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +1 -1
  85. package/dist/editor/ai/terminal/components/AgentMemoryPanel.d.ts +22 -5
  86. package/dist/editor/ai/terminal/components/AgentMemoryPanel.js +102 -19
  87. package/dist/editor/ai/terminal/components/AgentMemoryPanel.js.map +1 -1
  88. package/dist/editor/ai/terminal/components/AgentProfileModelSettingsSection.js +1 -1
  89. package/dist/editor/ai/terminal/components/AgentProfileSwitcher.js +1 -1
  90. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +8 -3
  91. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
  92. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js +46 -6
  93. package/dist/editor/ai/terminal/components/AgentPromptTrayPopovers.js.map +1 -1
  94. package/dist/editor/ai/terminal/components/AgentRunStatusBanners.js +1 -1
  95. package/dist/editor/ai/terminal/components/AgentSettingsContent.js +1 -1
  96. package/dist/editor/ai/terminal/components/AgentTerminalContextChrome.d.ts +1 -0
  97. package/dist/editor/ai/terminal/components/AgentTerminalContextChrome.js.map +1 -1
  98. package/dist/editor/ai/terminal/components/AgentTerminalContextPanels.js +1 -1
  99. package/dist/editor/ai/terminal/components/AgentTerminalContextPanels.js.map +1 -1
  100. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +1 -1
  101. package/dist/editor/ai/terminal/components/AgentTerminalMessageGroups.js +1 -1
  102. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js +1 -1
  103. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js.map +1 -1
  104. package/dist/editor/ai/terminal/components/AgentTerminalView.d.ts +1 -1
  105. package/dist/editor/ai/terminal/components/AgentTerminalView.js +1 -1
  106. package/dist/editor/ai/terminal/components/AiResponseMessage.js +1 -1
  107. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  108. package/dist/editor/ai/terminal/components/ContextInfoBar.d.ts +2 -1
  109. package/dist/editor/ai/terminal/components/ContextInfoBar.js +2 -2
  110. package/dist/editor/ai/terminal/components/ContextInfoBar.js.map +1 -1
  111. package/dist/editor/ai/terminal/components/EditOperationsPanel.js +1 -1
  112. package/dist/editor/ai/terminal/components/QuestionnaireRecap.d.ts +2 -2
  113. package/dist/editor/ai/terminal/components/ToolCallDisplay.js +3 -2
  114. package/dist/editor/ai/terminal/components/ToolCallDisplay.js.map +1 -1
  115. package/dist/editor/ai/terminal/components/UserMessage.js +1 -1
  116. package/dist/editor/ai/terminal/useAgentContextDisplayNames.d.ts +2 -0
  117. package/dist/editor/ai/terminal/useAgentContextDisplayNames.js +37 -28
  118. package/dist/editor/ai/terminal/useAgentContextDisplayNames.js.map +1 -1
  119. package/dist/editor/ai/terminal/useAgentEditorContextPipeline.d.ts +1 -0
  120. package/dist/editor/ai/terminal/useAgentInlineDialogPipeline.d.ts +1 -1
  121. package/dist/editor/ai/terminal/useAgentLoader.js +5 -2
  122. package/dist/editor/ai/terminal/useAgentLoader.js.map +1 -1
  123. package/dist/editor/ai/terminal/useAgentPromptComposerSurface.d.ts +2 -2
  124. package/dist/editor/ai/terminal/useAgentPromptQueueSocketHandler.d.ts +2 -0
  125. package/dist/editor/ai/terminal/useAgentPromptQueueSocketHandler.js +5 -3
  126. package/dist/editor/ai/terminal/useAgentPromptQueueSocketHandler.js.map +1 -1
  127. package/dist/editor/ai/terminal/useAgentRunMessagePipeline.d.ts +4 -4
  128. package/dist/editor/ai/terminal/useAgentRunStatusSocketHandler.js +3 -0
  129. package/dist/editor/ai/terminal/useAgentRunStatusSocketHandler.js.map +1 -1
  130. package/dist/editor/ai/terminal/useAgentSettingsPanel.d.ts +31 -31
  131. package/dist/editor/ai/terminal/useAgentSettleCompletedRun.js.map +1 -1
  132. package/dist/editor/ai/terminal/useAgentStopCommand.js +4 -0
  133. package/dist/editor/ai/terminal/useAgentStopCommand.js.map +1 -1
  134. package/dist/editor/ai/terminal/useAgentStreamPipeline.js +1 -0
  135. package/dist/editor/ai/terminal/useAgentStreamPipeline.js.map +1 -1
  136. package/dist/editor/ai/terminal/useAgentTerminalChrome.d.ts +1 -0
  137. package/dist/editor/ai/terminal/useAgentTerminalChrome.js +2 -2
  138. package/dist/editor/ai/terminal/useAgentTerminalChrome.js.map +1 -1
  139. package/dist/editor/ai/terminal/useAgentTerminalController.js +3 -1
  140. package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
  141. package/dist/editor/ai/useAgentPanes.js.map +1 -1
  142. package/dist/editor/ai/useAgentStatus.js.map +1 -1
  143. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  144. package/dist/editor/ai-image-editor/AiImageEditorDialog.js +42 -23
  145. package/dist/editor/ai-image-editor/AiImageEditorDialog.js.map +1 -1
  146. package/dist/editor/bridge/BridgeClient.js +6 -6
  147. package/dist/editor/bridge/BridgeClient.js.map +1 -1
  148. package/dist/editor/bridge/protocol.d.ts +26 -0
  149. package/dist/editor/bridge/protocol.js +1 -1
  150. package/dist/editor/bridge/protocol.js.map +1 -1
  151. package/dist/editor/client/AboutDialog.js +1 -1
  152. package/dist/editor/client/EditorShell.js +125 -90
  153. package/dist/editor/client/EditorShell.js.map +1 -1
  154. package/dist/editor/client/SessionExpiredOverlay.js +1 -1
  155. package/dist/editor/client/SessionExpiredOverlay.js.map +1 -1
  156. package/dist/editor/client/editContext.d.ts +26 -3
  157. package/dist/editor/client/editContext.js.map +1 -1
  158. package/dist/editor/client/fieldModificationStore.js +0 -21
  159. package/dist/editor/client/fieldModificationStore.js.map +1 -1
  160. package/dist/editor/client/hooks/useClientInfoRegistration.d.ts +13 -0
  161. package/dist/editor/client/hooks/useClientInfoRegistration.js +38 -0
  162. package/dist/editor/client/hooks/useClientInfoRegistration.js.map +1 -0
  163. package/dist/editor/client/itemsRepository.js +1 -34
  164. package/dist/editor/client/itemsRepository.js.map +1 -1
  165. package/dist/editor/client/operations.d.ts +4 -2
  166. package/dist/editor/client/operations.js +89 -65
  167. package/dist/editor/client/operations.js.map +1 -1
  168. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  169. package/dist/editor/client/ui/EditorChrome.d.ts +1 -0
  170. package/dist/editor/client/ui/EditorChrome.js +7 -2
  171. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  172. package/dist/editor/client/ui/FullscreenControls.d.ts +3 -0
  173. package/dist/editor/client/ui/FullscreenControls.js +7 -12
  174. package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
  175. package/dist/editor/client/undoTargetResolution.d.ts +28 -0
  176. package/dist/editor/client/undoTargetResolution.js +69 -0
  177. package/dist/editor/client/undoTargetResolution.js.map +1 -0
  178. package/dist/editor/commands/componentCommands.js +2 -2
  179. package/dist/editor/commands/componentCommands.js.map +1 -1
  180. package/dist/editor/commands/customCommandConverter.js.map +1 -1
  181. package/dist/editor/commands/itemCommands.js +19 -2
  182. package/dist/editor/commands/itemCommands.js.map +1 -1
  183. package/dist/editor/content-tree/IndicatorSettings.js +1 -1
  184. package/dist/editor/content-tree/TreeOptions.js +1 -1
  185. package/dist/editor/context-menu/InsertMenu.js +1 -1
  186. package/dist/editor/editor-warnings/NoLanguageWriteAccess.js +1 -1
  187. package/dist/editor/field-types/AttachmentEditor.js +7 -0
  188. package/dist/editor/field-types/AttachmentEditor.js.map +1 -1
  189. package/dist/editor/field-types/LinkFieldEditor.js +1 -1
  190. package/dist/editor/field-types/PictureFieldEditor.js +21 -21
  191. package/dist/editor/field-types/PictureFieldEditor.js.map +1 -1
  192. package/dist/editor/field-types/RichTextEditor.js +1 -1
  193. package/dist/editor/field-types/RichTextEditorComponent.js +6 -0
  194. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  195. package/dist/editor/field-types/SingleLineText.js +0 -34
  196. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  197. package/dist/editor/field-types/richtext/bridgeRichTextProfile.d.ts +1 -1
  198. package/dist/editor/field-types/richtext/components/EditorDropdown.js +1 -1
  199. package/dist/editor/field-types/richtext/components/ReactSlate.js +1 -1
  200. package/dist/editor/field-types/richtext/components/SimpleDropdown.js +1 -1
  201. package/dist/editor/field-types/richtext/components/SimpleToolbar.js +1 -1
  202. package/dist/editor/field-types/richtext/hooks/useRichTextProfile.js.map +1 -1
  203. package/dist/editor/field-types/richtext/utils/conversion.js +2 -4
  204. package/dist/editor/field-types/richtext/utils/conversion.js.map +1 -1
  205. package/dist/editor/field-types/richtext/utils/plugins.d.ts +1 -0
  206. package/dist/editor/field-types/richtext/utils/plugins.js +12 -0
  207. package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -1
  208. package/dist/editor/field-types/richtext/utils/profileMapper.js.map +1 -1
  209. package/dist/editor/field-types/useFormFieldCaretPresence.js.map +1 -1
  210. package/dist/editor/fieldValueDiagnostics.js.map +1 -1
  211. package/dist/editor/media-selector/MediaFolderBrowser.js +26 -4
  212. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  213. package/dist/editor/media-selector/Preview.js +6 -11
  214. package/dist/editor/media-selector/Preview.js.map +1 -1
  215. package/dist/editor/media-selector/Thumbnails.js +31 -3
  216. package/dist/editor/media-selector/Thumbnails.js.map +1 -1
  217. package/dist/editor/media-selector/TreeSelector.js +53 -6
  218. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  219. package/dist/editor/media-selector/UploadZone.d.ts +1 -2
  220. package/dist/editor/media-selector/UploadZone.js +3 -4
  221. package/dist/editor/media-selector/UploadZone.js.map +1 -1
  222. package/dist/editor/media-selector/mediaItemDrag.d.ts +28 -0
  223. package/dist/editor/media-selector/mediaItemDrag.js +42 -0
  224. package/dist/editor/media-selector/mediaItemDrag.js.map +1 -0
  225. package/dist/editor/menubar/ActiveUsers.js +6 -3
  226. package/dist/editor/menubar/ActiveUsers.js.map +1 -1
  227. package/dist/editor/menubar/GenericToolbar.js +1 -1
  228. package/dist/editor/menubar/GenericToolbar.js.map +1 -1
  229. package/dist/editor/menubar/ItemActionsMenu.js +1 -1
  230. package/dist/editor/menubar/ItemLanguageVersion.js +1 -1
  231. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
  232. package/dist/editor/menubar/OperationsIndicator.js +1 -1
  233. package/dist/editor/menubar/PageSelector.d.ts +2 -1
  234. package/dist/editor/menubar/PageSelector.js +14 -4
  235. package/dist/editor/menubar/PageSelector.js.map +1 -1
  236. package/dist/editor/menubar/VersionPreviewCard.js +1 -1
  237. package/dist/editor/menubar/VersionSelector.js +1 -1
  238. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js +1 -1
  239. package/dist/editor/menubar/toolbar-sections/DeviceSwitchToolbar.d.ts +3 -1
  240. package/dist/editor/menubar/toolbar-sections/DeviceSwitchToolbar.js +6 -7
  241. package/dist/editor/menubar/toolbar-sections/DeviceSwitchToolbar.js.map +1 -1
  242. package/dist/editor/menubar/toolbar-sections/EditControls.js +5 -5
  243. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  244. package/dist/editor/menubar/toolbar-sections/InsertControls.js +1 -1
  245. package/dist/editor/menubar/toolbar-sections/InsertControls.js.map +1 -1
  246. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +14 -4
  247. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  248. package/dist/editor/menubar/toolbar-sections/PreviewModeControl.d.ts +1 -0
  249. package/dist/editor/menubar/toolbar-sections/PreviewModeControl.js +14 -0
  250. package/dist/editor/menubar/toolbar-sections/PreviewModeControl.js.map +1 -0
  251. package/dist/editor/menubar/toolbar-sections/RefreshPageControl.d.ts +7 -0
  252. package/dist/editor/menubar/toolbar-sections/RefreshPageControl.js +44 -0
  253. package/dist/editor/menubar/toolbar-sections/RefreshPageControl.js.map +1 -0
  254. package/dist/editor/menubar/toolbar-sections/ReviewCommands.js +1 -1
  255. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +1 -1
  256. package/dist/editor/menubar/toolbar-sections/ViewportControls.d.ts +7 -0
  257. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +16 -8
  258. package/dist/editor/menubar/toolbar-sections/ViewportControls.js.map +1 -1
  259. package/dist/editor/menubar/toolbar-sections/index.d.ts +1 -0
  260. package/dist/editor/menubar/toolbar-sections/index.js +1 -0
  261. package/dist/editor/menubar/toolbar-sections/index.js.map +1 -1
  262. package/dist/editor/notifications/NotificationCenter.js +1 -1
  263. package/dist/editor/notifications/WatchButton.js +1 -1
  264. package/dist/editor/notifications/notificationListState.d.ts +1 -1
  265. package/dist/editor/notifications/notificationRoutes.js.map +1 -1
  266. package/dist/editor/notifications/useNotifications.d.ts +1 -1
  267. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +6 -3
  268. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +1 -1
  269. package/dist/editor/page-editor-chrome/CommentHighlightings.js +1 -1
  270. package/dist/editor/page-editor-chrome/DragInsertionOverlay.js +50 -22
  271. package/dist/editor/page-editor-chrome/DragInsertionOverlay.js.map +1 -1
  272. package/dist/editor/page-editor-chrome/EmptyImageFieldIndicators.js +1 -1
  273. package/dist/editor/page-editor-chrome/FeedbackHighlightBadge.js.map +1 -1
  274. package/dist/editor/page-editor-chrome/FieldActionIndicators.js +1 -1
  275. package/dist/editor/page-editor-chrome/FieldEditedIndicators.js +1 -1
  276. package/dist/editor/page-editor-chrome/FrameMenu.js +1 -1
  277. package/dist/editor/page-editor-chrome/FrameMenus.js +1 -1
  278. package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.d.ts +58 -0
  279. package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.js +709 -0
  280. package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.js.map +1 -0
  281. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +12 -2
  282. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
  283. package/dist/editor/page-editor-chrome/PageEditorChrome.js +7 -2
  284. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
  285. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +57 -10
  286. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
  287. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +1 -8
  288. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  289. package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +1 -0
  290. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +10 -3
  291. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  292. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +5 -2
  293. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
  294. package/dist/editor/page-editor-chrome/SuggestionVariantSwitcher.js +7 -2
  295. package/dist/editor/page-editor-chrome/SuggestionVariantSwitcher.js.map +1 -1
  296. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +5 -2
  297. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +153 -51
  298. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
  299. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
  300. package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +7 -0
  301. package/dist/editor/page-editor-chrome/overlay/geometry.js +35 -17
  302. package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
  303. package/dist/editor/page-editor-chrome/overlay/placeholderZones.js.map +1 -1
  304. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +18 -70
  305. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +1 -1
  306. package/dist/editor/page-viewer/MiniMap.js +1 -1
  307. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  308. package/dist/editor/page-viewer/MinimapDropTargets.js +1 -1
  309. package/dist/editor/page-viewer/PageViewer.js +5 -3
  310. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  311. package/dist/editor/page-viewer/PageViewerFrame.js +252 -121
  312. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  313. package/dist/editor/page-viewer/bridgeFieldPatch.js +0 -45
  314. package/dist/editor/page-viewer/bridgeFieldPatch.js.map +1 -1
  315. package/dist/editor/page-viewer/bridgeKeyboardShortcuts.d.ts +12 -0
  316. package/dist/editor/page-viewer/bridgeKeyboardShortcuts.js +27 -0
  317. package/dist/editor/page-viewer/bridgeKeyboardShortcuts.js.map +1 -1
  318. package/dist/editor/page-viewer/fullscreenPagePath.d.ts +1 -0
  319. package/dist/editor/page-viewer/fullscreenPagePath.js +11 -0
  320. package/dist/editor/page-viewer/fullscreenPagePath.js.map +1 -0
  321. package/dist/editor/page-viewer/internalLinkNavigation.d.ts +9 -0
  322. package/dist/editor/page-viewer/internalLinkNavigation.js +104 -0
  323. package/dist/editor/page-viewer/internalLinkNavigation.js.map +1 -0
  324. package/dist/editor/page-viewer/pageViewContext.d.ts +3 -1
  325. package/dist/editor/page-viewer/pageViewContext.js +14 -10
  326. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  327. package/dist/editor/page-viewer/parentBridgeInjection.d.ts +2 -0
  328. package/dist/editor/page-viewer/parentBridgeInjection.js +63 -16
  329. package/dist/editor/page-viewer/parentBridgeInjection.js.map +1 -1
  330. package/dist/editor/page-viewer/renderUrl.d.ts +1 -1
  331. package/dist/editor/personalization/ConditionTreeEditor.js +1 -1
  332. package/dist/editor/personalization/ConditionTreeEditor.js.map +1 -1
  333. package/dist/editor/personalization/PersonalizationPanel.js +1 -1
  334. package/dist/editor/personalization/TreeItemPicker.js +7 -1
  335. package/dist/editor/personalization/TreeItemPicker.js.map +1 -1
  336. package/dist/editor/personalization/utils.js.map +1 -1
  337. package/dist/editor/reviews/CommentEditor.js +1 -1
  338. package/dist/editor/reviews/CommentEditor.js.map +1 -1
  339. package/dist/editor/reviews/CommentView.js +1 -1
  340. package/dist/editor/reviews/Comments.js +5 -20
  341. package/dist/editor/reviews/Comments.js.map +1 -1
  342. package/dist/editor/reviews/CreateReviewDialog.js +1 -1
  343. package/dist/editor/reviews/DecisionsMatrix.js +1 -1
  344. package/dist/editor/reviews/EditReviewSettingsDialog.js +1 -1
  345. package/dist/editor/reviews/FeedbackFilters.d.ts +16 -0
  346. package/dist/editor/reviews/FeedbackFilters.js +45 -0
  347. package/dist/editor/reviews/FeedbackFilters.js.map +1 -0
  348. package/dist/editor/reviews/FeedbackModeIntro.js +2 -2
  349. package/dist/editor/reviews/FeedbackModeIntro.js.map +1 -1
  350. package/dist/editor/reviews/MentionText.js +1 -1
  351. package/dist/editor/reviews/ReviewCard.js +1 -1
  352. package/dist/editor/reviews/ReviewDetail.js +1 -1
  353. package/dist/editor/reviews/ReviewItemsPanel.js +74 -11
  354. package/dist/editor/reviews/ReviewItemsPanel.js.map +1 -1
  355. package/dist/editor/reviews/SecretPhraseInput.js +1 -1
  356. package/dist/editor/reviews/suggestedEditState.js.map +1 -1
  357. package/dist/editor/reviews/useMultiReview.js +5 -2
  358. package/dist/editor/reviews/useMultiReview.js.map +1 -1
  359. package/dist/editor/services/agentService.d.ts +91 -10
  360. package/dist/editor/services/agentService.js +100 -27
  361. package/dist/editor/services/agentService.js.map +1 -1
  362. package/dist/editor/services/aiService.js.map +1 -1
  363. package/dist/editor/services/contentService.d.ts +3 -1
  364. package/dist/editor/services/contentService.js +8 -0
  365. package/dist/editor/services/contentService.js.map +1 -1
  366. package/dist/editor/services/contextService.js.map +1 -1
  367. package/dist/editor/services/editService.js.map +1 -1
  368. package/dist/editor/services/favouritesService.d.ts +0 -7
  369. package/dist/editor/services/favouritesService.js +0 -7
  370. package/dist/editor/services/favouritesService.js.map +1 -1
  371. package/dist/editor/services/indexService.d.ts +3 -1
  372. package/dist/editor/services/indexService.js +8 -0
  373. package/dist/editor/services/indexService.js.map +1 -1
  374. package/dist/editor/services/localStorageService.js.map +1 -1
  375. package/dist/editor/services/reviewsService.js.map +1 -1
  376. package/dist/editor/services/serviceHelper.d.ts +3 -0
  377. package/dist/editor/services/serviceHelper.js +51 -1
  378. package/dist/editor/services/serviceHelper.js.map +1 -1
  379. package/dist/editor/services/suggestedEditsService.js.map +1 -1
  380. package/dist/editor/services/systemService.d.ts +10 -0
  381. package/dist/editor/services/systemService.js +3 -0
  382. package/dist/editor/services/systemService.js.map +1 -1
  383. package/dist/editor/services/textCompletionService.js +5 -0
  384. package/dist/editor/services/textCompletionService.js.map +1 -1
  385. package/dist/editor/settings/About.js +2 -4
  386. package/dist/editor/settings/About.js.map +1 -1
  387. package/dist/editor/settings/IndexOverview.js +3 -2
  388. package/dist/editor/settings/IndexOverview.js.map +1 -1
  389. package/dist/editor/settings/SettingsBreadcrumb.js +1 -1
  390. package/dist/editor/settings/SettingsView.js +1 -1
  391. package/dist/editor/settings/StatusSummary.js +1 -1
  392. package/dist/editor/settings/index/IndexGenerationsSection.d.ts +8 -0
  393. package/dist/editor/settings/index/IndexGenerationsSection.js +93 -0
  394. package/dist/editor/settings/index/IndexGenerationsSection.js.map +1 -0
  395. package/dist/editor/settings/panels/AgentProfileConfigPanel.js +1 -1
  396. package/dist/editor/settings/panels/AgentsPanel.js +1 -1
  397. package/dist/editor/settings/panels/CreateAgentProfileDialog.js +1 -1
  398. package/dist/editor/settings/panels/CreateJavaScriptToolDialog.js +1 -1
  399. package/dist/editor/settings/panels/CreateMcpServerDialog.js +1 -1
  400. package/dist/editor/settings/panels/JavaScriptToolsPanel.js +1 -1
  401. package/dist/editor/settings/panels/MemoriesPanel.d.ts +16 -0
  402. package/dist/editor/settings/panels/MemoriesPanel.js +291 -0
  403. package/dist/editor/settings/panels/MemoriesPanel.js.map +1 -0
  404. package/dist/editor/settings/panels/MemoryEntryDialog.d.ts +45 -0
  405. package/dist/editor/settings/panels/MemoryEntryDialog.js +167 -0
  406. package/dist/editor/settings/panels/MemoryEntryDialog.js.map +1 -0
  407. package/dist/editor/settings/panels/ModelsPanel.js +1 -1
  408. package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
  409. package/dist/editor/settings/panels/NotificationSubscriptionsPanel.js +1 -1
  410. package/dist/editor/settings/panels/NotificationSubscriptionsPanel.js.map +1 -1
  411. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +1 -1
  412. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  413. package/dist/editor/settings/panels/ProvidersPanel.js +1 -1
  414. package/dist/editor/settings/panels/RenderingHostsPanel.d.ts +2 -0
  415. package/dist/editor/settings/panels/RenderingHostsPanel.js +63 -0
  416. package/dist/editor/settings/panels/RenderingHostsPanel.js.map +1 -0
  417. package/dist/editor/settings/panels/SearchConfigPanel.js +6 -4
  418. package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
  419. package/dist/editor/settings/panels/StatusPanel.js +1 -1
  420. package/dist/editor/settings/panels/index.d.ts +2 -0
  421. package/dist/editor/settings/panels/index.js +2 -0
  422. package/dist/editor/settings/panels/index.js.map +1 -1
  423. package/dist/editor/setup-wizard/steps/CompleteStep.js +1 -1
  424. package/dist/editor/setup-wizard/steps/CreateSettingsStep.js +1 -1
  425. package/dist/editor/setup-wizard/steps/LicenseActivationStep.js +1 -1
  426. package/dist/editor/setup-wizard/steps/LicenseEmailStep.js +1 -1
  427. package/dist/editor/setup-wizard/steps/ModelSelectionStep.js +1 -1
  428. package/dist/editor/setup-wizard/steps/ProviderStep.js +1 -1
  429. package/dist/editor/sidebar/ComponentPalette.js +4 -4
  430. package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
  431. package/dist/editor/sidebar/ComponentTree.js +182 -61
  432. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  433. package/dist/editor/sidebar/ContentTreePanel.d.ts +2 -2
  434. package/dist/editor/sidebar/DictionaryEditor.js +1 -1
  435. package/dist/editor/sidebar/EditHistory.js +1 -1
  436. package/dist/editor/sidebar/Favorites.js.map +1 -1
  437. package/dist/editor/sidebar/NavigationPanelItem.js +1 -1
  438. package/dist/editor/sidebar/OperationItem.js +1 -1
  439. package/dist/editor/sidebar/Sessions.js +20 -9
  440. package/dist/editor/sidebar/Sessions.js.map +1 -1
  441. package/dist/editor/sidebar/Workbox.d.ts +8 -0
  442. package/dist/editor/sidebar/Workbox.js +94 -12
  443. package/dist/editor/sidebar/Workbox.js.map +1 -1
  444. package/dist/editor/sidebar/WorkboxFilters.d.ts +11 -0
  445. package/dist/editor/sidebar/WorkboxFilters.js +61 -0
  446. package/dist/editor/sidebar/WorkboxFilters.js.map +1 -0
  447. package/dist/editor/sidebar/WorkspaceRail.js +1 -1
  448. package/dist/editor/sidebar/useSharedComponentPublishState.js.map +1 -1
  449. package/dist/editor/template-wizard/TemplateBuilderDialog.js +1 -1
  450. package/dist/editor/template-wizard/TemplateStructureInlineEditor.js +1 -1
  451. package/dist/editor/tree-indicators/GutterColumns.js +1 -1
  452. package/dist/editor/tree-indicators/GutterContext.js +2 -2
  453. package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
  454. package/dist/editor/ui/DragPreview.js.map +1 -1
  455. package/dist/editor/ui/ItemCollectionEditor.js +1 -1
  456. package/dist/editor/ui/ItemNameDialogNew.d.ts +11 -0
  457. package/dist/editor/ui/ItemNameDialogNew.js +12 -7
  458. package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
  459. package/dist/editor/ui/ItemSearch.js +1 -1
  460. package/dist/editor/ui/PerfectTree.d.ts +5 -1
  461. package/dist/editor/ui/PerfectTree.js +7 -5
  462. package/dist/editor/ui/PerfectTree.js.map +1 -1
  463. package/dist/editor/ui/PublishDialog.js +1 -1
  464. package/dist/editor/ui/PublishItemDialog.js +1 -1
  465. package/dist/editor/ui/PublishRestrictionsDialog.js +2 -2
  466. package/dist/editor/ui/PublishRestrictionsDialog.js.map +1 -1
  467. package/dist/editor/ui/RemoveComponentsConfirmMessage.js +1 -1
  468. package/dist/editor/ui/SimpleIconButton.d.ts +1 -1
  469. package/dist/editor/ui/SimpleTable.d.ts +5 -1
  470. package/dist/editor/ui/SimpleTable.js +5 -1
  471. package/dist/editor/ui/SimpleTable.js.map +1 -1
  472. package/dist/editor/ui/Spinner.js +1 -1
  473. package/dist/editor/ui/Spinner.js.map +1 -1
  474. package/dist/editor/ui/WorkboxItemsTable.js +49 -20
  475. package/dist/editor/ui/WorkboxItemsTable.js.map +1 -1
  476. package/dist/editor/utils/selectionContext.js.map +1 -1
  477. package/dist/editor/utils/sitecoreDate.js +8 -2
  478. package/dist/editor/utils/sitecoreDate.js.map +1 -1
  479. package/dist/editor/version-diff/versionDiffGeometryKeys.d.ts +10 -0
  480. package/dist/editor/version-diff/versionDiffGeometryKeys.js +16 -0
  481. package/dist/editor/version-diff/versionDiffGeometryKeys.js.map +1 -0
  482. package/dist/editor/version-diff/versionDiffHighlightStyles.d.ts +6 -0
  483. package/dist/editor/version-diff/versionDiffHighlightStyles.js +6 -0
  484. package/dist/editor/version-diff/versionDiffHighlightStyles.js.map +1 -1
  485. package/dist/editor/version-diff/versionDiffTargets.d.ts +40 -1
  486. package/dist/editor/version-diff/versionDiffTargets.js +176 -15
  487. package/dist/editor/version-diff/versionDiffTargets.js.map +1 -1
  488. package/dist/editor/views/ItemEditor.js +1 -1
  489. package/dist/editor/views/ItemEditorPane.js +1 -1
  490. package/dist/editor/views/ItemEditorPane.js.map +1 -1
  491. package/dist/editor/views/SingleEditView.js +1 -1
  492. package/dist/lib/pointerDrag.js.map +1 -1
  493. package/dist/lib/safelist.js +1 -1
  494. package/dist/licensing/FeatureGate.d.ts +1 -1
  495. package/dist/licensing/LicenseContext.js.map +1 -1
  496. package/dist/licensing/LicenseOverlay.js +1 -1
  497. package/dist/logging/consolePrefix.js.map +1 -1
  498. package/dist/revision.d.ts +2 -2
  499. package/dist/revision.js +2 -2
  500. package/dist/setup/services/setupWizardService.d.ts +3 -56
  501. package/dist/setup/services/setupWizardService.js +0 -43
  502. package/dist/setup/services/setupWizardService.js.map +1 -1
  503. package/dist/setup/wizard/steps/ImportModelDialog.js +1 -1
  504. package/dist/splash-screen/NewPage.js +1 -1
  505. package/dist/splash-screen/RecentPages.js +1 -1
  506. package/dist/task-board/TaskBoardWorkspace.js +5 -0
  507. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  508. package/dist/task-board/components/ItemCollectionEditorDialog.js +1 -1
  509. package/dist/task-board/components/ProjectDashboard.js +1 -1
  510. package/dist/task-board/components/ProjectGoalsPanel.js +1 -1
  511. package/dist/task-board/components/ProjectSettingsDialog.js +1 -1
  512. package/dist/task-board/components/TaskBoardBreadcrumb.js +1 -1
  513. package/dist/task-board/components/TaskBoardProjectListSidebar.js +1 -1
  514. package/dist/task-board/components/TaskBoardProjectListSidebar.js.map +1 -1
  515. package/dist/task-board/components/TaskBoardTitlebar.js +1 -1
  516. package/dist/task-board/components/TaskDetailPanel.js +1 -1
  517. package/dist/task-board/components/TaskReviewActions.js +1 -1
  518. package/dist/task-board/components/TaskRow.js +1 -1
  519. package/dist/task-board/components/TaskboardPersistentLogPanel.js +1 -1
  520. package/dist/task-board/components/WizardCommunicationCenter.js +1 -1
  521. package/dist/task-board/components/WizardTask.js +1 -1
  522. package/dist/task-board/components/WizardTaskDetailsPanel.js +1 -1
  523. package/dist/task-board/services/goalService.d.ts +1 -14
  524. package/dist/task-board/services/goalService.js +0 -10
  525. package/dist/task-board/services/goalService.js.map +1 -1
  526. package/dist/task-board/services/taskService.d.ts +0 -11
  527. package/dist/task-board/services/taskService.js +0 -3
  528. package/dist/task-board/services/taskService.js.map +1 -1
  529. package/dist/task-board/views/DependencyGraphView.d.ts +13 -0
  530. package/dist/task-board/views/DependencyGraphView.js +62 -11
  531. package/dist/task-board/views/DependencyGraphView.js.map +1 -1
  532. package/dist/task-board/views/ListView.js +1 -1
  533. package/dist/tour/Tour.js +1 -1
  534. package/dist/tour/Tour.js.map +1 -1
  535. package/dist/tour/default-tour.js +1 -1
  536. package/dist/tour/preview-tour.js +1 -1
  537. package/dist/types.d.ts +33 -9
  538. package/package.json +3 -2
  539. package/styles.css +4 -4
  540. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +0 -5
  541. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +0 -12
  542. package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +0 -1
  543. package/dist/editor/ai/terminal/components/AgentThinkingDots.d.ts +0 -5
  544. package/dist/editor/ai/terminal/components/AgentThinkingDots.js +0 -9
  545. package/dist/editor/ai/terminal/components/AgentThinkingDots.js.map +0 -1
  546. package/dist/editor/reviews/CommentsAndFeedback.d.ts +0 -8
  547. package/dist/editor/reviews/CommentsAndFeedback.js +0 -17
  548. package/dist/editor/reviews/CommentsAndFeedback.js.map +0 -1
  549. package/dist/editor/reviews/CreateReviewDetailsStep.d.ts +0 -53
  550. package/dist/editor/reviews/CreateReviewDetailsStep.js +0 -77
  551. package/dist/editor/reviews/CreateReviewDetailsStep.js.map +0 -1
  552. package/dist/splash-screen/ParheliaAssistantChat.d.ts +0 -8
  553. package/dist/splash-screen/ParheliaAssistantChat.js +0 -507
  554. package/dist/splash-screen/ParheliaAssistantChat.js.map +0 -1
  555. package/dist/splash-screen/SplashScreenAgentContext.d.ts +0 -28
  556. package/dist/splash-screen/SplashScreenAgentContext.js +0 -51
  557. package/dist/splash-screen/SplashScreenAgentContext.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { providerDistinguishesSharedComponents } from "../services/contentService";
4
4
  import { useCanvasSelection, useEditContext, useEditContextRef, } from "../client/editContext";
5
5
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -15,6 +15,7 @@ import { SimpleIconButton, SimpleIconButtonStyleProvider, } from "../ui/SimpleIc
15
15
  import { Spinner } from "../ui/Spinner";
16
16
  import { SearchInput } from "../../components/SearchInput";
17
17
  import { Tooltip, TooltipContent, TooltipTrigger, } from "../../components/ui/tooltip";
18
+ import { Popover, PopoverContent, PopoverTrigger, } from "../../components/ui/popover";
18
19
  import { cn } from "../../lib/utils";
19
20
  import { InsertComponentMenu } from "../page-editor-chrome/InsertComponentMenu";
20
21
  import { useSharedComponentPublishState } from "./useSharedComponentPublishState";
@@ -53,7 +54,8 @@ export function ComponentTree({ pageViewContext, itemDescriptor, item, isLoading
53
54
  const [nodeDictionary, setNodeDictionary] = useState({});
54
55
  const [isTreeReady, setIsTreeReady] = useState(false);
55
56
  const [treeKey, setTreeKey] = useState(null);
56
- const [activeInsertBelowKey, setActiveInsertBelowKey] = useState(null);
57
+ const [activeInsertTargetKey, setActiveInsertTargetKey] = useState(null);
58
+ const [hoveredInsertTargetKey, setHoveredInsertTargetKey] = useState(null);
57
59
  let editContextRef = useEditContextRef();
58
60
  const editContext = useEditContext();
59
61
  const canvasSelection = useCanvasSelection();
@@ -190,7 +192,7 @@ export function ComponentTree({ pageViewContext, itemDescriptor, item, isLoading
190
192
  const selection = canvasSelection;
191
193
  useEffect(() => {
192
194
  if (editContext?.currentOverlay !== "context-menu") {
193
- setActiveInsertBelowKey(null);
195
+ setActiveInsertTargetKey(null);
194
196
  }
195
197
  }, [editContext?.currentOverlay]);
196
198
  useEffect(() => {
@@ -926,40 +928,82 @@ export function ComponentTree({ pageViewContext, itemDescriptor, item, isLoading
926
928
  }
927
929
  };
928
930
  }, []);
929
- // Whether a component can have a sibling inserted right after it. Mirrors the
930
- // on-canvas "append" affordance: the parent placeholder must be editable and
931
- // expose at least one visible insert option.
932
- const canInsertBelow = useCallback((component) => {
931
+ // A tree insertion target is useful only when its placeholder is editable and
932
+ // has at least one visible component option.
933
+ const canInsertIntoPlaceholder = useCallback((placeholder) => {
933
934
  if (!editContext || editContext.readonly || editContext.mode !== "edit") {
934
935
  return false;
935
936
  }
936
- const placeholder = component.parentPlaceholder;
937
- if (!placeholder?.editable)
937
+ if (!placeholder.editable)
938
938
  return false;
939
939
  return getVisibleInsertOptions(placeholder.insertOptions).length > 0;
940
940
  }, [editContext]);
941
- const getInsertBelowOptions = useCallback((component) => {
942
- const placeholder = component.parentPlaceholder;
943
- if (!placeholder?.editable)
941
+ const getPlaceholderInsertOptions = useCallback((placeholder) => {
942
+ if (!placeholder.editable)
944
943
  return [];
945
944
  return getVisibleInsertOptions(placeholder.insertOptions);
946
945
  }, []);
947
- // Add a component directly after the given one. The menu itself is the same
948
- // popover used by WYSIWYG placeholder dropzones; this keeps only the
949
- // component-tree-specific insertion index here.
950
- const handleInsertBelowSelect = useCallback(async (component, option) => {
946
+ const handleInsertSelect = useCallback(async (placeholder, insertIndex, option) => {
951
947
  const ctx = editContextRef.current;
952
- setActiveInsertBelowKey(null);
948
+ setActiveInsertTargetKey(null);
953
949
  if (!ctx || ctx.readonly || ctx.mode !== "edit")
954
950
  return;
955
- const placeholder = component.parentPlaceholder;
956
- if (!placeholder?.editable)
951
+ if (!placeholder.editable)
957
952
  return;
958
- const insertIndex = placeholder.components.findIndex((c) => c.id === component.id) + 1;
959
953
  await editContextRef.current?.operations.addComponent(option.typeId, placeholder.key, insertIndex, pageItemDescriptor);
960
954
  }, [editContextRef, pageItemDescriptor]);
961
- const handleInsertBelowOpenChange = useCallback((component, open) => {
962
- setActiveInsertBelowKey(open ? component.id : null);
955
+ const handleInsertOpenChange = useCallback((targetKey, open) => {
956
+ setActiveInsertTargetKey(open ? targetKey : null);
957
+ }, []);
958
+ const handleNodeInsertTargetHover = useCallback((node, event) => {
959
+ const treeNode = node;
960
+ if (treeNode.type !== "component") {
961
+ return;
962
+ }
963
+ const component = treeNode.data;
964
+ const parentPlaceholder = component.parentPlaceholder;
965
+ const canInsertSibling = !!parentPlaceholder && canInsertIntoPlaceholder(parentPlaceholder);
966
+ const componentIndex = parentPlaceholder?.components.findIndex((sibling) => sibling.id === component.id) ?? -1;
967
+ const precedingComponent = componentIndex > 0
968
+ ? parentPlaceholder?.components[componentIndex - 1]
969
+ : undefined;
970
+ const precedingGapTargetKey = precedingComponent
971
+ ? `below:${precedingComponent.id}`
972
+ : `above:${component.id}`;
973
+ const innerPlaceholders = component.placeholders?.filter(canInsertIntoPlaceholder) ?? [];
974
+ const innerTargetKey = innerPlaceholders.length === 1
975
+ ? getPlaceholderInsertTargetKey(component, innerPlaceholders[0])
976
+ : innerPlaceholders.length > 1
977
+ ? getPlaceholderPickerTargetKey(component)
978
+ : null;
979
+ const rowRect = event.currentTarget.getBoundingClientRect();
980
+ const relativeY = Math.max(0, Math.min(rowRect.height, event.clientY - rowRect.top));
981
+ const verticalRatio = rowRect.height > 0 ? relativeY / rowRect.height : 0;
982
+ let targetKey = null;
983
+ if (canInsertSibling && innerTargetKey) {
984
+ targetKey =
985
+ verticalRatio < 1 / 3
986
+ ? precedingGapTargetKey
987
+ : verticalRatio > 2 / 3
988
+ ? `below:${component.id}`
989
+ : innerTargetKey;
990
+ }
991
+ else if (innerTargetKey) {
992
+ targetKey = innerTargetKey;
993
+ }
994
+ else if (canInsertSibling) {
995
+ targetKey =
996
+ verticalRatio < 1 / 2
997
+ ? precedingGapTargetKey
998
+ : `below:${component.id}`;
999
+ }
1000
+ setHoveredInsertTargetKey((current) => current === targetKey ? current : targetKey);
1001
+ }, [canInsertIntoPlaceholder]);
1002
+ const handleNodeInsertTargetLeave = useCallback(() => {
1003
+ setHoveredInsertTargetKey(null);
1004
+ }, []);
1005
+ const handleInsertTargetHover = useCallback((targetKey) => {
1006
+ setHoveredInsertTargetKey(targetKey);
963
1007
  }, []);
964
1008
  // Check if we have a valid page model
965
1009
  const hasPageModel = page && page.rootComponent && page.item;
@@ -998,44 +1042,49 @@ export function ComponentTree({ pageViewContext, itemDescriptor, item, isLoading
998
1042
  };
999
1043
  // Only show error if page model failed to load (not if page is just empty)
1000
1044
  if (hasInvalidPageModel && isTreeReady && !isSlotLoading && !isRefreshing) {
1001
- return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(SimpleIconButtonStyleProvider, { selectedClassName: "bg-neutral-grey-5 text-neutral-grey-100", children: _jsxs("div", { className: "border-border-default badge-pad flex items-center justify-between border-b", children: [_jsx("div", { className: "flex items-center gap-1", children: _jsx(SimpleIconButton, { icon: _jsx(Plus, { strokeWidth: 1, className: "h-5 w-5" }), label: "Add component", size: "small", className: "h-[30px] w-[30px]", "data-testid": "component-tree-add-component", selected: insertMode, disabled: !canWriteItem ||
1045
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(SimpleIconButtonStyleProvider, { selectedClassName: "bg-neutral-grey-5 text-neutral-grey-100", children: _jsxs("div", { className: "border-border-default badge-pad flex items-center justify-between border-b", children: [_jsx("div", { className: "flex items-center gap-1", children: _jsx(SimpleIconButton, { icon: _jsx(Plus, { size: 16, strokeWidth: 1, absoluteStrokeWidth: true, className: "m-0.5" }), label: "Add component (Insert)", size: "small", className: "min-w-0 shrink gap-1.5 px-2 py-1 [&>svg]:shrink-0", "data-testid": "component-tree-add-component", selected: insertMode, showTooltip: false, disabled: !canWriteItem ||
1002
1046
  !editContext ||
1003
1047
  editContext.readonly ||
1004
- editContext.mode !== "edit", onClick: toggleInsertMode }) }), _jsx("div", { className: "flex items-center gap-1", children: _jsx(SimpleIconButton, { icon: _jsx(LayoutTemplate, { strokeWidth: 1, className: "h-5 w-5" }), label: editContext?.showLayoutComponents
1048
+ editContext.mode !== "edit", onClick: toggleInsertMode, children: _jsx("span", { className: "min-w-0 truncate", children: "Add component" }) }) }), _jsx("div", { className: "flex items-center gap-1", children: _jsx(SimpleIconButton, { icon: _jsx(LayoutTemplate, { strokeWidth: 1, className: "h-5 w-5" }), label: editContext?.showLayoutComponents
1005
1049
  ? "Hide layout"
1006
1050
  : "Show layout", size: "small", className: "h-[30px] w-[30px]", selected: editContext?.showLayoutComponents, "data-testid": "component-tree-toggle-layout", onClick: () => editContext?.setShowLayoutComponents(!editContext.showLayoutComponents) }) })] }) }), _jsx("div", { className: "text-neutral-grey-50 flex flex-1 items-center justify-center text-xs", children: "Page did not load. Please refresh or try again." }), _jsx(ConfirmationDialog, { ref: confirmDialogRef })] }));
1007
1051
  }
1008
- return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(SimpleIconButtonStyleProvider, { selectedClassName: "bg-neutral-grey-5 text-neutral-grey-100", children: _jsxs("div", { className: "border-border-default badge-pad flex items-center justify-between border-b", children: [_jsx("div", { className: "flex items-center gap-1", children: _jsx(SimpleIconButton, { icon: _jsx(Plus, { strokeWidth: 1, className: "h-4 w-4" }), label: "Add component", size: "small", "data-testid": "component-tree-add-component", selected: insertMode, disabled: !canWriteItem ||
1052
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(SimpleIconButtonStyleProvider, { selectedClassName: "bg-neutral-grey-5 text-neutral-grey-100", children: _jsxs("div", { className: "border-border-default badge-pad flex items-center justify-between border-b", children: [_jsx("div", { className: "flex items-center gap-1", children: _jsx(SimpleIconButton, { icon: _jsx(Plus, { size: 16, strokeWidth: 1, absoluteStrokeWidth: true, className: "m-0.5" }), label: "Add component (Insert)", size: "small", className: "min-w-0 shrink gap-1.5 px-2 py-1 [&>svg]:shrink-0", "data-testid": "component-tree-add-component", selected: insertMode, showTooltip: false, disabled: !canWriteItem ||
1009
1053
  !editContext ||
1010
1054
  editContext.readonly ||
1011
- editContext.mode !== "edit", onClick: toggleInsertMode }) }), _jsx("div", { className: "flex items-center gap-1", children: _jsx(SimpleIconButton, { icon: _jsx(LayoutTemplate, { strokeWidth: 1, className: "h-5 w-5" }), label: editContext?.showLayoutComponents
1055
+ editContext.mode !== "edit", onClick: toggleInsertMode, children: _jsx("span", { className: "min-w-0 truncate", children: "Add component" }) }) }), _jsx("div", { className: "flex items-center gap-1", children: _jsx(SimpleIconButton, { icon: _jsx(LayoutTemplate, { strokeWidth: 1, className: "h-5 w-5" }), label: editContext?.showLayoutComponents
1012
1056
  ? "Hide layout"
1013
- : "Show layout", size: "small", className: "h-[30px] w-[30px]", selected: editContext?.showLayoutComponents, "data-testid": "component-tree-toggle-layout", onClick: () => editContext?.setShowLayoutComponents(!editContext.showLayoutComponents) }) })] }) }), _jsx("div", { className: "border-border-default border-b p-2", "data-testid": "component-tree-search", children: _jsx(SearchInput, { value: filter, onChange: setFilter, className: "w-full", placeholder: "Search IDs, names, types..." }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto overflow-x-hidden p-2", ref: treeRef, "data-testid": "component-tree", children: isFiltering && visibleRootNodes.length === 0 ? (_jsxs("div", { className: "text-neutral-grey-50 flex h-full items-center justify-center px-4 text-center text-xs", children: ["No components match \"", filter.trim(), "\"."] })) : (_jsx(PerfectTree, { nodes: visibleRootNodes, isDragging: !isFiltering && !!editContext?.dragObject, multiDragNoun: "components", selectedKeys: selectedItems, expandedKeys: expandedItems, onToggleExpand: isFiltering ? undefined : handleToggle, onSelect: handleTreeSelection, onContextMenu: handleTreeContextMenu, enableDragAndDrop: !isFiltering, onDragOverZone: handleDragOverZone, isValidDropZone: handleIsValidDropZone, onStartDrag: handleStartDrag, onDragEnd: handleDragEnd, onDrop: handleDropZone, renderNodePrefix: (node) => {
1057
+ : "Show layout", size: "small", className: "h-[30px] w-[30px]", selected: editContext?.showLayoutComponents, "data-testid": "component-tree-toggle-layout", onClick: () => editContext?.setShowLayoutComponents(!editContext.showLayoutComponents) }) })] }) }), _jsx("div", { className: "border-border-default border-b p-2", "data-testid": "component-tree-search", children: _jsx(SearchInput, { value: filter, onChange: setFilter, className: "w-full", placeholder: "Search IDs, names, types..." }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto overflow-x-hidden p-2", ref: treeRef, "data-testid": "component-tree", children: isFiltering && visibleRootNodes.length === 0 ? (_jsxs("div", { className: "text-neutral-grey-50 flex h-full items-center justify-center px-4 text-center text-xs", children: ["No components match \"", filter.trim(), "\"."] })) : (_jsx(PerfectTree, { nodes: visibleRootNodes, isDragging: !isFiltering && !!editContext?.dragObject, multiDragNoun: "components", selectedKeys: selectedItems, expandedKeys: expandedItems, onToggleExpand: isFiltering ? undefined : handleToggle, onSelect: handleTreeSelection, onContextMenu: handleTreeContextMenu, enableDragAndDrop: !isFiltering, onDragOverZone: handleDragOverZone, isValidDropZone: handleIsValidDropZone, onStartDrag: handleStartDrag, onDragEnd: handleDragEnd, onDrop: handleDropZone, onNodeMouseMove: handleNodeInsertTargetHover, onNodeMouseLeave: handleNodeInsertTargetLeave, renderNodePrefix: (node) => {
1014
1058
  const treeNode = node;
1015
1059
  if (treeNode.type !== "component")
1016
1060
  return null;
1017
- return (_jsx("span", { className: cn("text-neutral-grey-50 hover:text-neutral-grey-100 flex h-[23px] w-4 flex-none cursor-grab items-center justify-center transition-colors active:cursor-grabbing"), "data-testid": "component-tree-drag-handle", "aria-hidden": "true", children: _jsx(GripVertical, { strokeWidth: 1, className: "h-4 w-4" }) }));
1061
+ return (_jsx("span", { className: cn("text-neutral-grey-50 hover:text-neutral-grey-100 group-hover:text-neutral-grey-100 flex h-[23px] w-4 flex-none cursor-grab items-center justify-center transition-colors active:cursor-grabbing"), "data-testid": "component-tree-drag-handle", "aria-hidden": "true", children: _jsx(GripVertical, { strokeWidth: 1, className: "h-4 w-4" }) }));
1018
1062
  }, renderToggleIcon: () => (_jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", className: "text-neutral-grey-100", "aria-hidden": "true", children: _jsx("path", { d: "M9 6L4.5 1.66987L4.5 10.3301L9 6Z", fill: "currentColor" }) })), suppressDefaultNodeChrome: (node) => node.type === "component", getRowClassName: (node, _depth, { isSelected, isDragOver }) => {
1019
1063
  const nodeType = node.type;
1020
1064
  if (nodeType === "component") {
1021
- return cn("group mb-1.5 gap-1 rounded-[4px] border px-1 py-2 transition-colors", isDragOver
1065
+ return cn("group mb-2 gap-1 rounded-[2px] border px-1 py-2 transition-colors", isDragOver
1022
1066
  ? "border-component-default bg-component-default/10"
1023
1067
  : isSelected
1024
1068
  ? "border-border-default bg-neutral-grey-5"
1025
1069
  : "border-border-default hover:border-neutral-grey-50");
1026
1070
  }
1027
- if (nodeType === "page" || nodeType === "placeholder") {
1028
- return "mb-1.5 [&>div:last-child]:py-2 [&[data-selected=true]>div:last-child]:bg-neutral-grey-5";
1071
+ if (nodeType === "page") {
1072
+ return cn("mb-1.5 [&>div:last-child]:py-2 [&[data-selected=true]>div:last-child]:bg-neutral-grey-5", isSelected && "bg-neutral-grey-5");
1073
+ }
1074
+ if (nodeType === "placeholder") {
1075
+ return cn("mb-1.5 [&>div:last-child]:py-2 [&[data-selected=true]>div:last-child]:bg-neutral-grey-5", isSelected && "bg-neutral-grey-5");
1029
1076
  }
1030
1077
  return undefined;
1031
1078
  }, renderNode: (node) => {
1032
1079
  const treeNode = node;
1033
1080
  return renderNode(treeNode, filter, {
1034
- canInsertBelow,
1035
- getInsertBelowOptions,
1036
- onInsertBelowSelect: handleInsertBelowSelect,
1037
- onInsertBelowOpenChange: handleInsertBelowOpenChange,
1038
- isInsertBelowActive: activeInsertBelowKey === treeNode.key,
1081
+ canInsertIntoPlaceholder,
1082
+ getPlaceholderInsertOptions,
1083
+ onInsertSelect: handleInsertSelect,
1084
+ onInsertOpenChange: handleInsertOpenChange,
1085
+ onInsertTargetHover: handleInsertTargetHover,
1086
+ activeInsertTargetKey,
1087
+ hoveredInsertTargetKey,
1039
1088
  });
1040
1089
  } })) }), _jsx(ConfirmationDialog, { ref: confirmDialogRef })] }));
1041
1090
  }
@@ -1043,34 +1092,106 @@ function renderNode(node, filter = "", opts) {
1043
1092
  const trimmedFilter = filter.trim();
1044
1093
  const filterDetails = trimmedFilter ? getNodeFilterDetails(node) : null;
1045
1094
  const component = node.type === "component" ? node.data : null;
1046
- const showInsertBelow = !!component && (opts?.canInsertBelow?.(component) ?? false);
1047
- const isInsertBelowActive = !!opts?.isInsertBelowActive;
1048
- const insertBelowOptions = showInsertBelow && component
1049
- ? (opts?.getInsertBelowOptions?.(component) ?? [])
1095
+ const parentPlaceholder = component?.parentPlaceholder;
1096
+ const showSiblingInsertTargets = !!parentPlaceholder &&
1097
+ (opts?.canInsertIntoPlaceholder?.(parentPlaceholder) ?? false);
1098
+ const componentIndex = component && parentPlaceholder
1099
+ ? parentPlaceholder.components.findIndex((item) => item.id === component.id)
1100
+ : -1;
1101
+ const siblingInsertOptions = showSiblingInsertTargets && parentPlaceholder
1102
+ ? (opts?.getPlaceholderInsertOptions?.(parentPlaceholder) ?? [])
1050
1103
  : [];
1051
- return (_jsxs("div", { className: `component-tree-node ${node.type ? `component-tree-${node.type}` : ""}`, "data-component-node": node.type === "component" ? "true" : undefined, "data-testid": "component-tree-node", "data-component-key": node.key, "data-component-type": node.type, children: [_jsxs("div", { className: "text-neutral-grey-100 flex items-center gap-2 text-[12px]", children: [typeof node.icon === "string" ? (_jsx("i", { className: node.icon })) : (node.icon), _jsx("span", { className: node.className, "data-testid": "component-tree-node-label", children: highlightSearchMatch(node.label, trimmedFilter) }), node.tags?.map((x) => (_jsx("div", { children: _jsxs("span", { id: `id-${node.key}-${x.id}`, className: "ml-2 flex rounded p-0.5 px-1.5 text-xs text-white", style: {
1052
- backgroundColor: x.color,
1053
- marginLeft: "8px",
1054
- fontSize: "10px",
1055
- }, title: x.tooltip, onClick: x.onClick
1056
- ? (e) => {
1057
- e.stopPropagation();
1058
- x.onClick();
1059
- }
1060
- : undefined, children: [x.icon, highlightSearchMatch(x.value, trimmedFilter)] }) }, `tag-${node.key}-${x.id}`)))] }), filterDetails ? (_jsx("div", { className: "text-neutral-grey-50 mt-0.5 ml-6 truncate text-[10px]", title: filterDetails, children: highlightSearchMatch(filterDetails, trimmedFilter) })) : null, showInsertBelow ? (_jsxs(Tooltip, { children: [_jsx(InsertComponentMenu, { open: isInsertBelowActive, onOpenChange: (open) => opts?.onInsertBelowOpenChange?.(component, open), title: "Insert below", options: insertBelowOptions, onSelect: (option) => opts?.onInsertBelowSelect?.(component, option), side: "right", align: "start", sideOffset: 12, children: _jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "data-testid": "component-tree-insert-below", "data-active": isInsertBelowActive ? "true" : undefined, "aria-label": "Insert component below", onMouseDown: (e) => e.stopPropagation(), onClick: (e) => {
1061
- e.stopPropagation();
1062
- if (e.ctrlKey || e.metaKey) {
1063
- e.preventDefault();
1064
- const matchingOption = getMatchingInsertBelowOption(component, insertBelowOptions);
1065
- if (matchingOption) {
1066
- opts?.onInsertBelowSelect?.(component, matchingOption);
1104
+ const isBetweenGap = !!parentPlaceholder &&
1105
+ componentIndex >= 0 &&
1106
+ componentIndex < parentPlaceholder.components.length - 1;
1107
+ const placeholderInsertTargets = component?.placeholders?.filter((placeholder) => opts?.canInsertIntoPlaceholder?.(placeholder) ?? false) ?? [];
1108
+ return (_jsxs("div", { className: `component-tree-node w-full min-w-0 ${node.type ? `component-tree-${node.type}` : ""}`, "data-component-node": node.type === "component" ? "true" : undefined, "data-testid": "component-tree-node", "data-component-key": node.key, "data-component-type": node.type, children: [_jsxs("div", { className: "text-neutral-grey-100 flex min-w-0 items-center gap-2 text-[12px]", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [typeof node.icon === "string" ? (_jsx("i", { className: node.icon })) : (node.icon), _jsx("span", { className: cn("truncate", node.className), "data-testid": "component-tree-node-label", children: highlightSearchMatch(node.label, trimmedFilter) }), node.tags?.map((x) => (_jsx("div", { children: _jsxs("span", { id: `id-${node.key}-${x.id}`, className: "ml-2 flex rounded p-0.5 px-1.5 text-xs text-white", style: {
1109
+ backgroundColor: x.color,
1110
+ marginLeft: "8px",
1111
+ fontSize: "10px",
1112
+ }, title: x.tooltip, onClick: x.onClick
1113
+ ? (e) => {
1114
+ e.stopPropagation();
1115
+ x.onClick();
1067
1116
  }
1068
- }
1069
- }, className: cn("bg-component-default absolute bottom-0 left-1/2 z-20 flex h-6 w-6 -translate-x-1/2 translate-y-1/2 items-center justify-center rounded-[4px] text-white transition-all hover:brightness-105 active:scale-95", isInsertBelowActive
1070
- ? "pointer-events-auto opacity-100"
1071
- : "pointer-events-none opacity-0 group-hover:pointer-events-auto group-hover:opacity-100 focus-visible:pointer-events-auto focus-visible:opacity-100"), children: _jsx(Plus, { className: "h-4 w-4", strokeWidth: 1 }) }) }) }), _jsx(TooltipContent, { side: "right", sideOffset: 8, children: "Insert component below" })] })) : null] }));
1117
+ : undefined, children: [x.icon, highlightSearchMatch(x.value, trimmedFilter)] }) }, `tag-${node.key}-${x.id}`)))] }), component && placeholderInsertTargets.length > 0 ? (_jsx(ComponentTreePlaceholderInsertControl, { component: component, placeholders: placeholderInsertTargets, activeTargetKey: opts?.activeInsertTargetKey, hoveredTargetKey: opts?.hoveredInsertTargetKey, getOptions: (placeholder) => opts?.getPlaceholderInsertOptions?.(placeholder) ?? [], onOpenChange: opts?.onInsertOpenChange, onSelect: (placeholder, option) => opts?.onInsertSelect?.(placeholder, placeholder.components.length, option) })) : null] }), filterDetails ? (_jsx("div", { className: "text-neutral-grey-50 mt-0.5 ml-6 truncate text-[10px]", title: filterDetails, children: highlightSearchMatch(filterDetails, trimmedFilter) })) : null, showSiblingInsertTargets && parentPlaceholder && componentIndex >= 0 ? (_jsxs(_Fragment, { children: [componentIndex === 0 ? (_jsx(ComponentTreeGapInsertControl, { placement: "above", targetKey: `above:${component.id}`, activeTargetKey: opts?.activeInsertTargetKey, hoveredTargetKey: opts?.hoveredInsertTargetKey, onHoverTarget: opts?.onInsertTargetHover, testId: "component-tree-insert-above", title: "Insert above", ariaLabel: "Insert component above", options: siblingInsertOptions, onOpenChange: opts?.onInsertOpenChange, onSelect: (option) => opts?.onInsertSelect?.(parentPlaceholder, componentIndex, option), quickInsertComponent: component })) : null, _jsx(ComponentTreeGapInsertControl, { placement: "below", targetKey: `below:${component.id}`, activeTargetKey: opts?.activeInsertTargetKey, hoveredTargetKey: opts?.hoveredInsertTargetKey, onHoverTarget: opts?.onInsertTargetHover, testId: "component-tree-insert-below", title: isBetweenGap ? "Insert between" : "Insert below", ariaLabel: isBetweenGap
1118
+ ? "Insert component between"
1119
+ : "Insert component below", options: siblingInsertOptions, onOpenChange: opts?.onInsertOpenChange, onSelect: (option) => opts?.onInsertSelect?.(parentPlaceholder, componentIndex + 1, option), quickInsertComponent: component })] })) : null] }));
1120
+ }
1121
+ function ComponentTreePlaceholderInsertControl({ component, placeholders, activeTargetKey, hoveredTargetKey, getOptions, onOpenChange, onSelect, }) {
1122
+ const [selectedPlaceholder, setSelectedPlaceholder] = useState(null);
1123
+ const pickerTargetKey = getPlaceholderPickerTargetKey(component);
1124
+ const selectedTargetKey = selectedPlaceholder
1125
+ ? getPlaceholderInsertTargetKey(component, selectedPlaceholder)
1126
+ : null;
1127
+ if (placeholders.length === 1) {
1128
+ const placeholder = placeholders[0];
1129
+ const targetKey = getPlaceholderInsertTargetKey(component, placeholder);
1130
+ const label = cleanComponentTreePlaceholderLabel(placeholder);
1131
+ return (_jsx("div", { className: "ml-auto flex max-w-[60%] min-w-0 shrink items-center justify-end", "data-testid": "component-tree-placeholder-actions", children: _jsx(ComponentTreeInsertButton, { targetKey: targetKey, activeTargetKey: activeTargetKey, hoverVisible: hoveredTargetKey === targetKey, testId: "component-tree-insert-placeholder", title: `Insert into ${label}`, ariaLabel: `Insert component into ${label} placeholder`, options: getOptions(placeholder), onOpenChange: onOpenChange, onSelect: (option) => onSelect(placeholder, option), className: "relative h-6 w-6 shrink-0", children: _jsx(Plus, { className: "h-4 w-4", strokeWidth: 1 }) }) }));
1132
+ }
1133
+ if (selectedPlaceholder &&
1134
+ selectedTargetKey &&
1135
+ activeTargetKey === selectedTargetKey) {
1136
+ const label = cleanComponentTreePlaceholderLabel(selectedPlaceholder);
1137
+ return (_jsx("div", { className: "ml-auto flex max-w-[60%] min-w-0 shrink items-center justify-end", "data-testid": "component-tree-placeholder-actions", children: _jsx(ComponentTreeInsertButton, { targetKey: selectedTargetKey, activeTargetKey: activeTargetKey, hoverVisible: hoveredTargetKey === selectedTargetKey, testId: "component-tree-insert-placeholder", title: `Insert into ${label}`, ariaLabel: `Insert component into ${label} placeholder`, options: getOptions(selectedPlaceholder), onOpenChange: (targetKey, open) => {
1138
+ if (!open)
1139
+ setSelectedPlaceholder(null);
1140
+ onOpenChange?.(targetKey, open);
1141
+ }, onSelect: (option) => {
1142
+ setSelectedPlaceholder(null);
1143
+ onSelect(selectedPlaceholder, option);
1144
+ }, className: "relative h-6 w-6 shrink-0", children: _jsx(Plus, { className: "h-4 w-4", strokeWidth: 1 }) }) }));
1145
+ }
1146
+ const pickerOpen = activeTargetKey === pickerTargetKey;
1147
+ const pickerHoverVisible = hoveredTargetKey === pickerTargetKey;
1148
+ return (_jsx("div", { className: "ml-auto flex max-w-[60%] min-w-0 shrink items-center justify-end", "data-testid": "component-tree-placeholder-actions", children: _jsxs(Popover, { open: pickerOpen, onOpenChange: (open) => onOpenChange?.(pickerTargetKey, open), children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx("button", { type: "button", "data-testid": "component-tree-insert-placeholder", "data-insert-target": pickerTargetKey, "data-active": pickerOpen ? "true" : undefined, "aria-label": "Choose a placeholder to insert a component into", onMouseDown: (event) => event.stopPropagation(), onClick: (event) => event.stopPropagation(), className: cn("bg-component-default relative flex h-6 w-6 shrink-0 items-center justify-center rounded-[4px] text-white transition-all hover:brightness-105 active:scale-95", pickerOpen || pickerHoverVisible
1149
+ ? "pointer-events-auto opacity-100"
1150
+ : "pointer-events-none opacity-0 focus-visible:pointer-events-auto focus-visible:opacity-100"), children: _jsx(Plus, { className: "h-4 w-4", strokeWidth: 1 }) }) }), _jsxs(PopoverContent, { side: "right", align: "start", sideOffset: 12, collisionPadding: 12, onOpenAutoFocus: (event) => event.preventDefault(), "data-testid": "component-tree-placeholder-picker", className: "border-border-default text-popover-foreground z-250 w-60 max-w-[15rem] overflow-hidden rounded-[4px] border bg-white/95 p-1.5 backdrop-blur-md", children: [_jsx("div", { className: "text-neutral-grey-50 px-2 pt-1 pb-1.5 text-[11px] font-semibold tracking-wide uppercase", children: "Choose placeholder" }), _jsx("div", { className: "flex flex-col gap-0.5", children: placeholders.map((placeholder) => {
1151
+ const label = cleanComponentTreePlaceholderLabel(placeholder);
1152
+ return (_jsxs("button", { type: "button", "data-testid": "component-tree-placeholder-option", "data-placeholder-key": placeholder.key, onClick: (event) => {
1153
+ event.preventDefault();
1154
+ event.stopPropagation();
1155
+ setSelectedPlaceholder(placeholder);
1156
+ onOpenChange?.(getPlaceholderInsertTargetKey(component, placeholder), true);
1157
+ }, className: "hover:bg-neutral-grey-5 focus-visible:bg-neutral-grey-5 flex w-full items-center gap-2 rounded-[4px] px-2 py-1.5 text-left text-[12px] transition-colors focus-visible:outline-none", children: [_jsx(Folder, { className: "text-neutral-grey-50 h-4 w-4 shrink-0", strokeWidth: 1 }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), _jsx(ChevronRight, { className: "text-neutral-grey-50 h-3.5 w-3.5 shrink-0", strokeWidth: 1 })] }, placeholder.key));
1158
+ }) })] })] }) }));
1159
+ }
1160
+ function ComponentTreeGapInsertControl({ placement, targetKey, activeTargetKey, hoveredTargetKey, onHoverTarget, testId, title, ariaLabel, options, onOpenChange, onSelect, quickInsertComponent, }) {
1161
+ const isActive = activeTargetKey === targetKey;
1162
+ const isHoverVisible = hoveredTargetKey === targetKey;
1163
+ return (_jsxs("div", { className: cn("pointer-events-none absolute right-0 left-0 z-20 flex h-6 items-center justify-center transition-opacity", placement === "above"
1164
+ ? "top-0 -translate-y-[17px]"
1165
+ : "bottom-0 translate-y-[17px]", isActive || isHoverVisible
1166
+ ? "opacity-100"
1167
+ : "opacity-0 focus-within:opacity-100"), "data-testid": `${testId}-gap`, onMouseEnter: () => onHoverTarget?.(targetKey), onMouseLeave: () => onHoverTarget?.(null), children: [_jsx("span", { className: "pointer-events-auto absolute inset-x-0 top-1/2 h-2 -translate-y-1/2", "data-testid": "component-tree-insert-gap-hover-zone", "data-insert-target": targetKey }), _jsx("span", { className: "bg-component-default absolute inset-x-0 top-1/2 h-[2px] -translate-y-1/2 rounded-full", "data-testid": "component-tree-insert-gap-line" }), _jsx(ComponentTreeInsertButton, { targetKey: targetKey, activeTargetKey: activeTargetKey, hoverVisible: isHoverVisible, testId: testId, title: title, ariaLabel: ariaLabel, options: options, onOpenChange: onOpenChange, onSelect: onSelect, quickInsertComponent: quickInsertComponent, className: "relative z-10 h-6 w-6 shrink-0", children: _jsx(Plus, { className: "h-4 w-4", strokeWidth: 1 }) })] }));
1168
+ }
1169
+ function ComponentTreeInsertButton({ targetKey, activeTargetKey, hoverVisible, testId, title, ariaLabel, options, onOpenChange, onSelect, quickInsertComponent, className, children, }) {
1170
+ const isActive = activeTargetKey === targetKey;
1171
+ return (_jsxs(Tooltip, { children: [_jsx(InsertComponentMenu, { open: isActive, onOpenChange: (open) => onOpenChange?.(targetKey, open), title: title, options: options, onSelect: onSelect, side: "right", align: "start", sideOffset: 12, children: _jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "data-testid": testId, "data-insert-target": targetKey, "data-active": isActive ? "true" : undefined, "aria-label": ariaLabel, onMouseDown: (event) => event.stopPropagation(), onClick: (event) => {
1172
+ event.stopPropagation();
1173
+ if (quickInsertComponent && (event.ctrlKey || event.metaKey)) {
1174
+ event.preventDefault();
1175
+ const matchingOption = getMatchingInsertOption(quickInsertComponent, options);
1176
+ if (matchingOption)
1177
+ onSelect(matchingOption);
1178
+ }
1179
+ }, className: cn("bg-component-default flex items-center justify-center rounded-[4px] text-white transition-all hover:brightness-105 active:scale-95", isActive || hoverVisible
1180
+ ? "pointer-events-auto opacity-100"
1181
+ : "pointer-events-none opacity-0 focus-visible:pointer-events-auto focus-visible:opacity-100", className), children: children }) }) }), _jsx(TooltipContent, { side: "right", sideOffset: 8, children: title })] }));
1182
+ }
1183
+ function getPlaceholderInsertTargetKey(component, placeholder) {
1184
+ return `placeholder:${component.id}:${placeholder.key}`;
1185
+ }
1186
+ function getPlaceholderPickerTargetKey(component) {
1187
+ return `placeholder-picker:${component.id}`;
1188
+ }
1189
+ function cleanComponentTreePlaceholderLabel(placeholder) {
1190
+ return (placeholder.description ||
1191
+ placeholder.name ||
1192
+ placeholder.key).replace(/_{[0-9a-fA-F-]+}$/, "");
1072
1193
  }
1073
- function getMatchingInsertBelowOption(component, insertOptions) {
1194
+ function getMatchingInsertOption(component, insertOptions) {
1074
1195
  const componentTypeId = normalizeInsertTypeId(component.typeId);
1075
1196
  if (!componentTypeId)
1076
1197
  return undefined;