@parhelia/core 0.4.12825 → 0.4.12871

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 (1047) hide show
  1. package/dist/components/emoji/EmojiPicker.d.ts +18 -0
  2. package/dist/components/emoji/EmojiPicker.js +102 -0
  3. package/dist/components/emoji/EmojiPicker.js.map +1 -0
  4. package/dist/components/emoji/EmojiText.d.ts +19 -0
  5. package/dist/components/emoji/EmojiText.js +30 -0
  6. package/dist/components/emoji/EmojiText.js.map +1 -0
  7. package/dist/components/emoji/emojiData.generated.d.ts +2 -0
  8. package/dist/components/emoji/emojiData.generated.js +1878 -0
  9. package/dist/components/emoji/emojiData.generated.js.map +1 -0
  10. package/dist/components/emoji/emojiIndex.d.ts +46 -0
  11. package/dist/components/emoji/emojiIndex.js +173 -0
  12. package/dist/components/emoji/emojiIndex.js.map +1 -0
  13. package/dist/components/emoji/emoticons.d.ts +21 -0
  14. package/dist/components/emoji/emoticons.js +167 -0
  15. package/dist/components/emoji/emoticons.js.map +1 -0
  16. package/dist/components/emoji/textareaInsert.d.ts +19 -0
  17. package/dist/components/emoji/textareaInsert.js +29 -0
  18. package/dist/components/emoji/textareaInsert.js.map +1 -0
  19. package/dist/components/emoji/twemoji.d.ts +30 -0
  20. package/dist/components/emoji/twemoji.js +84 -0
  21. package/dist/components/emoji/twemoji.js.map +1 -0
  22. package/dist/components/ui/alert.d.ts +6 -1
  23. package/dist/components/ui/alert.js +12 -3
  24. package/dist/components/ui/alert.js.map +1 -1
  25. package/dist/components/ui/context-menu.d.ts +25 -0
  26. package/dist/components/ui/context-menu.js +54 -36
  27. package/dist/components/ui/context-menu.js.map +1 -1
  28. package/dist/components/ui/copy-button.d.ts +3 -1
  29. package/dist/components/ui/copy-button.js +13 -2
  30. package/dist/components/ui/copy-button.js.map +1 -1
  31. package/dist/components/ui/mention-textarea.d.ts +8 -0
  32. package/dist/components/ui/mention-textarea.js +98 -46
  33. package/dist/components/ui/mention-textarea.js.map +1 -1
  34. package/dist/components/ui/paste-button.js +11 -1
  35. package/dist/components/ui/paste-button.js.map +1 -1
  36. package/dist/config/config.js +43 -4
  37. package/dist/config/config.js.map +1 -1
  38. package/dist/config/types.d.ts +2 -0
  39. package/dist/config/types.js.map +1 -1
  40. package/dist/editor/ConcurrentUserLimitDialog.js +5 -2
  41. package/dist/editor/ConcurrentUserLimitDialog.js.map +1 -1
  42. package/dist/editor/ContentTree.js +7 -2
  43. package/dist/editor/ContentTree.js.map +1 -1
  44. package/dist/editor/ContextMenu.js +11 -36
  45. package/dist/editor/ContextMenu.js.map +1 -1
  46. package/dist/editor/EditorWarning.js +8 -4
  47. package/dist/editor/EditorWarning.js.map +1 -1
  48. package/dist/editor/FieldList.js +1 -1
  49. package/dist/editor/FieldList.js.map +1 -1
  50. package/dist/editor/FieldListField.js +18 -13
  51. package/dist/editor/FieldListField.js.map +1 -1
  52. package/dist/editor/FieldListFieldWithFallbacks.js +1 -1
  53. package/dist/editor/GlobalMenuBar.js +2 -1
  54. package/dist/editor/GlobalMenuBar.js.map +1 -1
  55. package/dist/editor/ImageEditor.js +3 -1
  56. package/dist/editor/ImageEditor.js.map +1 -1
  57. package/dist/editor/MainLayout.js +1 -1
  58. package/dist/editor/MainLayout.js.map +1 -1
  59. package/dist/editor/MigrationsView.js +3 -2
  60. package/dist/editor/MigrationsView.js.map +1 -1
  61. package/dist/editor/MobileLayout.js +43 -20
  62. package/dist/editor/MobileLayout.js.map +1 -1
  63. package/dist/editor/PictureEditor.js +4 -2
  64. package/dist/editor/PictureEditor.js.map +1 -1
  65. package/dist/editor/QuickItemSwitcher.js +4 -2
  66. package/dist/editor/QuickItemSwitcher.js.map +1 -1
  67. package/dist/editor/agent-changes/agentChangeTargets.js +6 -0
  68. package/dist/editor/agent-changes/agentChangeTargets.js.map +1 -1
  69. package/dist/editor/agent-changes/agentChangeTextHighlight.d.ts +48 -4
  70. package/dist/editor/agent-changes/agentChangeTextHighlight.js +67 -9
  71. package/dist/editor/agent-changes/agentChangeTextHighlight.js.map +1 -1
  72. package/dist/editor/ai/HeartbeatDiagnosticsPanel.js +1 -1
  73. package/dist/editor/ai/InlineAiDialog.js +11 -8
  74. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  75. package/dist/editor/ai/InlineAiTrigger.js +18 -14
  76. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  77. package/dist/editor/ai/agentActivitySummary.js +5 -0
  78. package/dist/editor/ai/agentActivitySummary.js.map +1 -1
  79. package/dist/editor/ai/agentMessageConversion.js +1 -0
  80. package/dist/editor/ai/agentMessageConversion.js.map +1 -1
  81. package/dist/editor/ai/agentMessageMarkdown.js +4 -4
  82. package/dist/editor/ai/agentMessageMarkdown.js.map +1 -1
  83. package/dist/editor/ai/dialogs/capturePageScreenshot.d.ts +4 -1
  84. package/dist/editor/ai/dialogs/capturePageScreenshot.js +214 -44
  85. package/dist/editor/ai/dialogs/capturePageScreenshot.js.map +1 -1
  86. package/dist/editor/ai/dialogs/captureShared.d.ts +8 -1
  87. package/dist/editor/ai/dialogs/captureShared.js +4 -1
  88. package/dist/editor/ai/dialogs/captureShared.js.map +1 -1
  89. package/dist/editor/ai/dialogs/offscreenPageCapture.js +1 -1
  90. package/dist/editor/ai/dialogs/offscreenPageCapture.js.map +1 -1
  91. package/dist/editor/ai/prepareInlineAiTextSelection.d.ts +2 -1
  92. package/dist/editor/ai/prepareInlineAiTextSelection.js +1 -2
  93. package/dist/editor/ai/prepareInlineAiTextSelection.js.map +1 -1
  94. package/dist/editor/ai/terminal/agentCost.d.ts +2 -0
  95. package/dist/editor/ai/terminal/agentCost.js +1 -0
  96. package/dist/editor/ai/terminal/agentCost.js.map +1 -1
  97. package/dist/editor/ai/terminal/agentSessionLiveTotals.js +3 -0
  98. package/dist/editor/ai/terminal/agentSessionLiveTotals.js.map +1 -1
  99. package/dist/editor/ai/terminal/agentSessionSelectors.d.ts +5 -2
  100. package/dist/editor/ai/terminal/agentSessionSelectors.js +5 -2
  101. package/dist/editor/ai/terminal/agentSessionSelectors.js.map +1 -1
  102. package/dist/editor/ai/terminal/agentSessionState.js +8 -1
  103. package/dist/editor/ai/terminal/agentSessionState.js.map +1 -1
  104. package/dist/editor/ai/terminal/components/AgentActivityOverviewPanel.js +2 -2
  105. package/dist/editor/ai/terminal/components/AgentActivityOverviewPanel.js.map +1 -1
  106. package/dist/editor/ai/terminal/components/AgentBanners.js +2 -2
  107. package/dist/editor/ai/terminal/components/AgentBanners.js.map +1 -1
  108. package/dist/editor/ai/terminal/components/AgentCostDisplay.d.ts +2 -0
  109. package/dist/editor/ai/terminal/components/AgentCostDisplay.js +2 -1
  110. package/dist/editor/ai/terminal/components/AgentCostDisplay.js.map +1 -1
  111. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +1 -1
  112. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
  113. package/dist/editor/ai/terminal/components/AgentModeSelector.js +7 -3
  114. package/dist/editor/ai/terminal/components/AgentModeSelector.js.map +1 -1
  115. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +3 -3
  116. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
  117. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +2 -2
  118. package/dist/editor/ai/terminal/components/AgentReadOnlyNotice.js +1 -1
  119. package/dist/editor/ai/terminal/components/AgentReadOnlyNotice.js.map +1 -1
  120. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +1 -1
  121. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.d.ts +5 -2
  122. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js +43 -4
  123. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js.map +1 -1
  124. package/dist/editor/ai/terminal/components/AgentTerminalSummaryLayout.js +1 -1
  125. package/dist/editor/ai/terminal/components/AgentTerminalSummaryLayout.js.map +1 -1
  126. package/dist/editor/ai/terminal/components/AiResponseMessage.js +32 -15
  127. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  128. package/dist/editor/ai/terminal/components/ApprovalCard.d.ts +3 -1
  129. package/dist/editor/ai/terminal/components/ApprovalCard.js +8 -16
  130. package/dist/editor/ai/terminal/components/ApprovalCard.js.map +1 -1
  131. package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js +1 -1
  132. package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js.map +1 -1
  133. package/dist/editor/ai/terminal/components/EditFieldToolCallContent.d.ts +7 -4
  134. package/dist/editor/ai/terminal/components/EditFieldToolCallContent.js +57 -32
  135. package/dist/editor/ai/terminal/components/EditFieldToolCallContent.js.map +1 -1
  136. package/dist/editor/ai/terminal/components/ResponseTurnDuration.js +1 -2
  137. package/dist/editor/ai/terminal/components/ResponseTurnDuration.js.map +1 -1
  138. package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.d.ts +6 -0
  139. package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.js +61 -0
  140. package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.js.map +1 -0
  141. package/dist/editor/ai/terminal/components/ToolCallDisplay.d.ts +5 -0
  142. package/dist/editor/ai/terminal/components/ToolCallDisplay.js +19 -8
  143. package/dist/editor/ai/terminal/components/ToolCallDisplay.js.map +1 -1
  144. package/dist/editor/ai/terminal/components/UserMessage.js +4 -2
  145. package/dist/editor/ai/terminal/components/UserMessage.js.map +1 -1
  146. package/dist/editor/ai/terminal/components/ValueDiff.js +1 -1
  147. package/dist/editor/ai/terminal/components/ValueDiff.js.map +1 -1
  148. package/dist/editor/ai/terminal/components/toolCallContentRenderers.js +7 -4
  149. package/dist/editor/ai/terminal/components/toolCallContentRenderers.js.map +1 -1
  150. package/dist/editor/ai/terminal/components/useApprovalActions.js +1 -1
  151. package/dist/editor/ai/terminal/components/useApprovalActions.js.map +1 -1
  152. package/dist/editor/ai/terminal/toolCallDiagnostics.d.ts +34 -0
  153. package/dist/editor/ai/terminal/toolCallDiagnostics.js +218 -0
  154. package/dist/editor/ai/terminal/toolCallDiagnostics.js.map +1 -0
  155. package/dist/editor/ai/terminal/types.d.ts +1 -0
  156. package/dist/editor/ai/terminal/useAgentEditorContext.js +3 -1
  157. package/dist/editor/ai/terminal/useAgentEditorContext.js.map +1 -1
  158. package/dist/editor/ai/terminal/useAgentLoadPipeline.d.ts +1 -0
  159. package/dist/editor/ai/terminal/useAgentLoadPipeline.js +2 -1
  160. package/dist/editor/ai/terminal/useAgentLoadPipeline.js.map +1 -1
  161. package/dist/editor/ai/terminal/useAgentLoader.d.ts +2 -0
  162. package/dist/editor/ai/terminal/useAgentLoader.js +17 -2
  163. package/dist/editor/ai/terminal/useAgentLoader.js.map +1 -1
  164. package/dist/editor/ai/terminal/useAgentModeState.d.ts +5 -1
  165. package/dist/editor/ai/terminal/useAgentModeState.js +11 -3
  166. package/dist/editor/ai/terminal/useAgentModeState.js.map +1 -1
  167. package/dist/editor/ai/terminal/useAgentRunDeltaSocketHandler.d.ts +1 -0
  168. package/dist/editor/ai/terminal/useAgentRunDeltaSocketHandler.js +5 -1
  169. package/dist/editor/ai/terminal/useAgentRunDeltaSocketHandler.js.map +1 -1
  170. package/dist/editor/ai/terminal/useAgentRunRefs.d.ts +1 -0
  171. package/dist/editor/ai/terminal/useAgentRunRefs.js +3 -0
  172. package/dist/editor/ai/terminal/useAgentRunRefs.js.map +1 -1
  173. package/dist/editor/ai/terminal/useAgentSessionSync.d.ts +6 -0
  174. package/dist/editor/ai/terminal/useAgentSessionSync.js +27 -3
  175. package/dist/editor/ai/terminal/useAgentSessionSync.js.map +1 -1
  176. package/dist/editor/ai/terminal/useAgentSettingsData.d.ts +1 -1
  177. package/dist/editor/ai/terminal/useAgentSettingsPanel.js +7 -6
  178. package/dist/editor/ai/terminal/useAgentSettingsPanel.js.map +1 -1
  179. package/dist/editor/ai/terminal/useAgentSettingsSelectOptions.js +14 -2
  180. package/dist/editor/ai/terminal/useAgentSettingsSelectOptions.js.map +1 -1
  181. package/dist/editor/ai/terminal/useAgentStatusBarContent.js +11 -4
  182. package/dist/editor/ai/terminal/useAgentStatusBarContent.js.map +1 -1
  183. package/dist/editor/ai/terminal/useAgentStreamPipeline.d.ts +1 -0
  184. package/dist/editor/ai/terminal/useAgentStreamPipeline.js +2 -1
  185. package/dist/editor/ai/terminal/useAgentStreamPipeline.js.map +1 -1
  186. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js +11 -2
  187. package/dist/editor/ai/terminal/useAgentSubmitHandlers.js.map +1 -1
  188. package/dist/editor/ai/terminal/useAgentTerminalController.js +3 -1
  189. package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
  190. package/dist/editor/ai/terminal/useAgentToolCallHandler.js +1 -0
  191. package/dist/editor/ai/terminal/useAgentToolCallHandler.js.map +1 -1
  192. package/dist/editor/ai/types.d.ts +4 -0
  193. package/dist/editor/ai-image-editor/AiImageEditorDialog.d.ts +33 -0
  194. package/dist/editor/ai-image-editor/AiImageEditorDialog.js +372 -127
  195. package/dist/editor/ai-image-editor/AiImageEditorDialog.js.map +1 -1
  196. package/dist/editor/ai-image-editor/AiImageResultOverlay.js +4 -2
  197. package/dist/editor/ai-image-editor/AiImageResultOverlay.js.map +1 -1
  198. package/dist/editor/bridge/BridgeClient.js +11 -0
  199. package/dist/editor/bridge/BridgeClient.js.map +1 -1
  200. package/dist/editor/bridge/protocol.d.ts +56 -0
  201. package/dist/editor/bridge/protocol.js +3 -0
  202. package/dist/editor/bridge/protocol.js.map +1 -1
  203. package/dist/editor/client/EditorShell.js +331 -122
  204. package/dist/editor/client/EditorShell.js.map +1 -1
  205. package/dist/editor/client/SessionExpiredOverlay.js +9 -2
  206. package/dist/editor/client/SessionExpiredOverlay.js.map +1 -1
  207. package/dist/editor/client/clipboardStorage.d.ts +10 -0
  208. package/dist/editor/client/clipboardStorage.js +57 -0
  209. package/dist/editor/client/clipboardStorage.js.map +1 -0
  210. package/dist/editor/client/editContext.d.ts +92 -11
  211. package/dist/editor/client/editContext.js.map +1 -1
  212. package/dist/editor/client/editHistoryReconciliation.d.ts +2 -1
  213. package/dist/editor/client/editHistoryReconciliation.js +5 -2
  214. package/dist/editor/client/editHistoryReconciliation.js.map +1 -1
  215. package/dist/editor/client/hooks/useRepositoryItemRefresh.d.ts +4 -0
  216. package/dist/editor/client/hooks/useRepositoryItemRefresh.js +62 -0
  217. package/dist/editor/client/hooks/useRepositoryItemRefresh.js.map +1 -0
  218. package/dist/editor/client/hooks/useSocketMessageHandler.d.ts +6 -0
  219. package/dist/editor/client/hooks/useSocketMessageHandler.js +66 -3
  220. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  221. package/dist/editor/client/itemsRepository.d.ts +10 -2
  222. package/dist/editor/client/itemsRepository.js +224 -43
  223. package/dist/editor/client/itemsRepository.js.map +1 -1
  224. package/dist/editor/client/liveEditState.d.ts +16 -0
  225. package/dist/editor/client/liveEditState.js +25 -0
  226. package/dist/editor/client/liveEditState.js.map +1 -0
  227. package/dist/editor/client/liveSessionState.d.ts +6 -0
  228. package/dist/editor/client/liveSessionState.js +20 -0
  229. package/dist/editor/client/liveSessionState.js.map +1 -0
  230. package/dist/editor/client/operations.d.ts +13 -2
  231. package/dist/editor/client/operations.js +100 -29
  232. package/dist/editor/client/operations.js.map +1 -1
  233. package/dist/editor/client/pageModelBuilder.d.ts +6 -0
  234. package/dist/editor/client/pageModelBuilder.js +74 -7
  235. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  236. package/dist/editor/client/ui/EditorChrome.d.ts +2 -2
  237. package/dist/editor/client/ui/EditorChrome.js +12 -8
  238. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  239. package/dist/editor/client/ui/FullscreenControls.d.ts +3 -5
  240. package/dist/editor/client/ui/FullscreenControls.js +2 -2
  241. package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
  242. package/dist/editor/client/valueStore.d.ts +22 -0
  243. package/dist/editor/client/valueStore.js +29 -0
  244. package/dist/editor/client/valueStore.js.map +1 -0
  245. package/dist/editor/commands/componentClipboardCommands.d.ts +35 -0
  246. package/dist/editor/commands/componentClipboardCommands.js +271 -0
  247. package/dist/editor/commands/componentClipboardCommands.js.map +1 -0
  248. package/dist/editor/commands/componentCommands.js +80 -19
  249. package/dist/editor/commands/componentCommands.js.map +1 -1
  250. package/dist/editor/commands/componentMenuGroups.d.ts +2 -0
  251. package/dist/editor/commands/componentMenuGroups.js +43 -0
  252. package/dist/editor/commands/componentMenuGroups.js.map +1 -0
  253. package/dist/editor/commands/itemCommands.d.ts +9 -0
  254. package/dist/editor/commands/itemCommands.js +76 -9
  255. package/dist/editor/commands/itemCommands.js.map +1 -1
  256. package/dist/editor/component-conversion/ComponentTypePickerDialog.d.ts +12 -0
  257. package/dist/editor/component-conversion/ComponentTypePickerDialog.js +40 -0
  258. package/dist/editor/component-conversion/ComponentTypePickerDialog.js.map +1 -0
  259. package/dist/editor/component-conversion/ConversionAiDebugButton.d.ts +17 -0
  260. package/dist/editor/component-conversion/ConversionAiDebugButton.js +80 -0
  261. package/dist/editor/component-conversion/ConversionAiDebugButton.js.map +1 -0
  262. package/dist/editor/component-conversion/ConvertComponentDialog.d.ts +28 -0
  263. package/dist/editor/component-conversion/ConvertComponentDialog.js +633 -0
  264. package/dist/editor/component-conversion/ConvertComponentDialog.js.map +1 -0
  265. package/dist/editor/component-conversion/conversionModel.d.ts +109 -0
  266. package/dist/editor/component-conversion/conversionModel.js +519 -0
  267. package/dist/editor/component-conversion/conversionModel.js.map +1 -0
  268. package/dist/editor/component-conversion/conversionService.d.ts +12 -0
  269. package/dist/editor/component-conversion/conversionService.js +16 -0
  270. package/dist/editor/component-conversion/conversionService.js.map +1 -0
  271. package/dist/editor/component-conversion/conversionTypes.d.ts +214 -0
  272. package/dist/editor/component-conversion/conversionTypes.js +2 -0
  273. package/dist/editor/component-conversion/conversionTypes.js.map +1 -0
  274. package/dist/editor/component-conversion/convertComponentsCommand.d.ts +25 -0
  275. package/dist/editor/component-conversion/convertComponentsCommand.js +196 -0
  276. package/dist/editor/component-conversion/convertComponentsCommand.js.map +1 -0
  277. package/dist/editor/editor-warnings/ValidationErrors.js +4 -4
  278. package/dist/editor/editor-warnings/ValidationErrors.js.map +1 -1
  279. package/dist/editor/field-types/AttachmentEditor.js +4 -3
  280. package/dist/editor/field-types/AttachmentEditor.js.map +1 -1
  281. package/dist/editor/field-types/DateFieldEditor.js +2 -1
  282. package/dist/editor/field-types/DateFieldEditor.js.map +1 -1
  283. package/dist/editor/field-types/DateTimeFieldEditor.js +2 -1
  284. package/dist/editor/field-types/DateTimeFieldEditor.js.map +1 -1
  285. package/dist/editor/field-types/DropLinkEditor.js +3 -1
  286. package/dist/editor/field-types/DropLinkEditor.js.map +1 -1
  287. package/dist/editor/field-types/DropListEditor.js +3 -1
  288. package/dist/editor/field-types/DropListEditor.js.map +1 -1
  289. package/dist/editor/field-types/FieldHistoryBoundary.js +28 -7
  290. package/dist/editor/field-types/FieldHistoryBoundary.js.map +1 -1
  291. package/dist/editor/field-types/ImageFieldEditor.js +3 -1
  292. package/dist/editor/field-types/ImageFieldEditor.js.map +1 -1
  293. package/dist/editor/field-types/InternalLinkFieldEditor.js +2 -1
  294. package/dist/editor/field-types/InternalLinkFieldEditor.js.map +1 -1
  295. package/dist/editor/field-types/LinkFieldEditor.js +2 -1
  296. package/dist/editor/field-types/LinkFieldEditor.js.map +1 -1
  297. package/dist/editor/field-types/MultiLineText.js +68 -22
  298. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  299. package/dist/editor/field-types/NameValueListEditor.js +3 -1
  300. package/dist/editor/field-types/NameValueListEditor.js.map +1 -1
  301. package/dist/editor/field-types/PictureFieldEditor.js +4 -2
  302. package/dist/editor/field-types/PictureFieldEditor.js.map +1 -1
  303. package/dist/editor/field-types/RawEditor.js +7 -4
  304. package/dist/editor/field-types/RawEditor.js.map +1 -1
  305. package/dist/editor/field-types/RichTextEditor.d.ts +1 -2
  306. package/dist/editor/field-types/RichTextEditor.js +5 -26
  307. package/dist/editor/field-types/RichTextEditor.js.map +1 -1
  308. package/dist/editor/field-types/RichTextEditorComponent.d.ts +1 -2
  309. package/dist/editor/field-types/RichTextEditorComponent.js +120 -34
  310. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  311. package/dist/editor/field-types/SingleLineText.js +68 -22
  312. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  313. package/dist/editor/field-types/TreeListEditor.js +4 -2
  314. package/dist/editor/field-types/TreeListEditor.js.map +1 -1
  315. package/dist/editor/field-types/fieldStyles.d.ts +21 -0
  316. package/dist/editor/field-types/fieldStyles.js +22 -0
  317. package/dist/editor/field-types/fieldStyles.js.map +1 -0
  318. package/dist/editor/field-types/richtext/bridgeRichTextProfile.d.ts +15 -1
  319. package/dist/editor/field-types/richtext/bridgeRichTextProfile.js +27 -0
  320. package/dist/editor/field-types/richtext/bridgeRichTextProfile.js.map +1 -1
  321. package/dist/editor/field-types/richtext/components/EditorDropdown.css +14 -0
  322. package/dist/editor/field-types/richtext/components/EditorDropdown.d.ts +3 -1
  323. package/dist/editor/field-types/richtext/components/EditorDropdown.js +33 -8
  324. package/dist/editor/field-types/richtext/components/EditorDropdown.js.map +1 -1
  325. package/dist/editor/field-types/richtext/components/ReactSlate.css +23 -54
  326. package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +10 -1
  327. package/dist/editor/field-types/richtext/components/ReactSlate.js +365 -172
  328. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  329. package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.js +1 -1
  330. package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.js.map +1 -1
  331. package/dist/editor/field-types/richtext/components/ToolbarButton.js +13 -5
  332. package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -1
  333. package/dist/editor/field-types/richtext/config/pluginFactory.d.ts +2 -0
  334. package/dist/editor/field-types/richtext/config/pluginFactory.js +2 -1
  335. package/dist/editor/field-types/richtext/config/pluginFactory.js.map +1 -1
  336. package/dist/editor/field-types/richtext/hooks/useProfileCache.js +1 -0
  337. package/dist/editor/field-types/richtext/hooks/useProfileCache.js.map +1 -1
  338. package/dist/editor/field-types/richtext/hooks/useRichTextProfile.d.ts +0 -2
  339. package/dist/editor/field-types/richtext/hooks/useRichTextProfile.js +2 -5
  340. package/dist/editor/field-types/richtext/hooks/useRichTextProfile.js.map +1 -1
  341. package/dist/editor/field-types/richtext/types.d.ts +47 -2
  342. package/dist/editor/field-types/richtext/types.js +19 -0
  343. package/dist/editor/field-types/richtext/types.js.map +1 -1
  344. package/dist/editor/field-types/richtext/utils/changeHighlight.d.ts +14 -0
  345. package/dist/editor/field-types/richtext/utils/changeHighlight.js +12 -1
  346. package/dist/editor/field-types/richtext/utils/changeHighlight.js.map +1 -1
  347. package/dist/editor/field-types/richtext/utils/conversion.js +108 -32
  348. package/dist/editor/field-types/richtext/utils/conversion.js.map +1 -1
  349. package/dist/editor/field-types/richtext/utils/cssClasses.d.ts +27 -0
  350. package/dist/editor/field-types/richtext/utils/cssClasses.js +98 -0
  351. package/dist/editor/field-types/richtext/utils/cssClasses.js.map +1 -0
  352. package/dist/editor/field-types/richtext/utils/plugins.d.ts +40 -1
  353. package/dist/editor/field-types/richtext/utils/plugins.js +178 -4
  354. package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -1
  355. package/dist/editor/field-types/richtext/utils/profileMapper.d.ts +17 -1
  356. package/dist/editor/field-types/richtext/utils/profileMapper.js +153 -55
  357. package/dist/editor/field-types/richtext/utils/profileMapper.js.map +1 -1
  358. package/dist/editor/field-types/richtext/utils/spellCheckText.d.ts +31 -0
  359. package/dist/editor/field-types/richtext/utils/spellCheckText.js +82 -0
  360. package/dist/editor/field-types/richtext/utils/spellCheckText.js.map +1 -0
  361. package/dist/editor/field-types/useFocusedFieldInput.d.ts +13 -0
  362. package/dist/editor/field-types/useFocusedFieldInput.js +50 -0
  363. package/dist/editor/field-types/useFocusedFieldInput.js.map +1 -0
  364. package/dist/editor/field-types/useFormFieldCaretPresence.js +8 -1
  365. package/dist/editor/field-types/useFormFieldCaretPresence.js.map +1 -1
  366. package/dist/editor/field-types/useFormFieldSelectionRange.d.ts +20 -13
  367. package/dist/editor/field-types/useFormFieldSelectionRange.js +40 -14
  368. package/dist/editor/field-types/useFormFieldSelectionRange.js.map +1 -1
  369. package/dist/editor/find-replace/findReplaceTargets.d.ts +2 -0
  370. package/dist/editor/find-replace/findReplaceTargets.js +2 -2
  371. package/dist/editor/find-replace/findReplaceTargets.js.map +1 -1
  372. package/dist/editor/itemContextMenuGroups.js +10 -1
  373. package/dist/editor/itemContextMenuGroups.js.map +1 -1
  374. package/dist/editor/media-selector/AiImageSearch.js +1 -163
  375. package/dist/editor/media-selector/AiImageSearch.js.map +1 -1
  376. package/dist/editor/media-selector/MediaDetailsView.d.ts +14 -0
  377. package/dist/editor/media-selector/MediaDetailsView.js +152 -0
  378. package/dist/editor/media-selector/MediaDetailsView.js.map +1 -0
  379. package/dist/editor/media-selector/MediaFolderBrowser.js +326 -106
  380. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  381. package/dist/editor/media-selector/TreeSelector.js +40 -2
  382. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  383. package/dist/editor/media-selector/UploadZone.js +1 -1
  384. package/dist/editor/media-selector/UploadZone.js.map +1 -1
  385. package/dist/editor/media-selector/useMediaFolderDrag.d.ts +26 -0
  386. package/dist/editor/media-selector/useMediaFolderDrag.js +153 -0
  387. package/dist/editor/media-selector/useMediaFolderDrag.js.map +1 -0
  388. package/dist/editor/menubar/ActiveUsers.js +5 -3
  389. package/dist/editor/menubar/ActiveUsers.js.map +1 -1
  390. package/dist/editor/menubar/PageSelector.js +21 -22
  391. package/dist/editor/menubar/PageSelector.js.map +1 -1
  392. package/dist/editor/menubar/ToolbarFactory.js +8 -2
  393. package/dist/editor/menubar/ToolbarFactory.js.map +1 -1
  394. package/dist/editor/menubar/VersionPreviewCard.js +4 -2
  395. package/dist/editor/menubar/VersionPreviewCard.js.map +1 -1
  396. package/dist/editor/menubar/WorkflowButton.js +10 -10
  397. package/dist/editor/menubar/WorkflowButton.js.map +1 -1
  398. package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.d.ts +13 -0
  399. package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.js +88 -0
  400. package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.js.map +1 -0
  401. package/dist/editor/menubar/toolbar-sections/DeviceSwitchToolbar.d.ts +3 -4
  402. package/dist/editor/menubar/toolbar-sections/DeviceSwitchToolbar.js +15 -13
  403. package/dist/editor/menubar/toolbar-sections/DeviceSwitchToolbar.js.map +1 -1
  404. package/dist/editor/menubar/toolbar-sections/EditControls.d.ts +9 -0
  405. package/dist/editor/menubar/toolbar-sections/EditControls.js +24 -1
  406. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  407. package/dist/editor/menubar/toolbar-sections/FullscreenControl.js +3 -2
  408. package/dist/editor/menubar/toolbar-sections/FullscreenControl.js.map +1 -1
  409. package/dist/editor/menubar/toolbar-sections/InsertControls.js +4 -2
  410. package/dist/editor/menubar/toolbar-sections/InsertControls.js.map +1 -1
  411. package/dist/editor/menubar/toolbar-sections/LayoutModeControls.js +3 -2
  412. package/dist/editor/menubar/toolbar-sections/LayoutModeControls.js.map +1 -1
  413. package/dist/editor/menubar/toolbar-sections/ReviewCommands.js +2 -2
  414. package/dist/editor/menubar/toolbar-sections/ReviewCommands.js.map +1 -1
  415. package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.d.ts +5 -0
  416. package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.js +16 -0
  417. package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.js.map +1 -0
  418. package/dist/editor/menubar/toolbar-sections/UndoRedoControls.js +2 -2
  419. package/dist/editor/menubar/toolbar-sections/UndoRedoControls.js.map +1 -1
  420. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +7 -7
  421. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  422. package/dist/editor/menubar/toolbar-sections/ViewportControls.d.ts +3 -4
  423. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +19 -31
  424. package/dist/editor/menubar/toolbar-sections/ViewportControls.js.map +1 -1
  425. package/dist/editor/menubar/toolbar-sections/index.d.ts +1 -1
  426. package/dist/editor/menubar/toolbar-sections/index.js +1 -1
  427. package/dist/editor/menubar/toolbar-sections/index.js.map +1 -1
  428. package/dist/editor/mobileBottomPanel.d.ts +40 -0
  429. package/dist/editor/mobileBottomPanel.js +63 -0
  430. package/dist/editor/mobileBottomPanel.js.map +1 -0
  431. package/dist/editor/notifications/useNotifications.js +12 -17
  432. package/dist/editor/notifications/useNotifications.js.map +1 -1
  433. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.d.ts +3 -6
  434. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js +8 -6
  435. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js.map +1 -1
  436. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +5 -1
  437. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +60 -10
  438. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +1 -1
  439. package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.d.ts +6 -0
  440. package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.js +100 -0
  441. package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.js.map +1 -0
  442. package/dist/editor/page-editor-chrome/BridgeToolbarDropdown.d.ts +16 -0
  443. package/dist/editor/page-editor-chrome/BridgeToolbarDropdown.js +23 -0
  444. package/dist/editor/page-editor-chrome/BridgeToolbarDropdown.js.map +1 -0
  445. package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.d.ts +9 -0
  446. package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.js +32 -0
  447. package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.js.map +1 -0
  448. package/dist/editor/page-editor-chrome/CommentHighlightings.d.ts +4 -1
  449. package/dist/editor/page-editor-chrome/CommentHighlightings.js +195 -388
  450. package/dist/editor/page-editor-chrome/CommentHighlightings.js.map +1 -1
  451. package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.d.ts +14 -0
  452. package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.js +110 -0
  453. package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.js.map +1 -0
  454. package/dist/editor/page-editor-chrome/ConversionIndicators.d.ts +8 -0
  455. package/dist/editor/page-editor-chrome/ConversionIndicators.js +75 -0
  456. package/dist/editor/page-editor-chrome/ConversionIndicators.js.map +1 -0
  457. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.d.ts +9 -13
  458. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js +25 -20
  459. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js.map +1 -1
  460. package/dist/editor/page-editor-chrome/DragInsertionOverlay.js +21 -17
  461. package/dist/editor/page-editor-chrome/DragInsertionOverlay.js.map +1 -1
  462. package/dist/editor/page-editor-chrome/EmptyImageFieldIndicators.d.ts +1 -1
  463. package/dist/editor/page-editor-chrome/EmptyImageFieldIndicators.js +9 -6
  464. package/dist/editor/page-editor-chrome/EmptyImageFieldIndicators.js.map +1 -1
  465. package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.d.ts +15 -0
  466. package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.js +31 -0
  467. package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.js.map +1 -0
  468. package/dist/editor/page-editor-chrome/FieldActionIndicator.d.ts +1 -1
  469. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +6 -3
  470. package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
  471. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +10 -6
  472. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js.map +1 -1
  473. package/dist/editor/page-editor-chrome/FindReplaceHighlightings.d.ts +1 -1
  474. package/dist/editor/page-editor-chrome/FindReplaceHighlightings.js +7 -4
  475. package/dist/editor/page-editor-chrome/FindReplaceHighlightings.js.map +1 -1
  476. package/dist/editor/page-editor-chrome/FrameMenu.d.ts +1 -1
  477. package/dist/editor/page-editor-chrome/FrameMenu.js +13 -11
  478. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  479. package/dist/editor/page-editor-chrome/FrameMenus.d.ts +1 -1
  480. package/dist/editor/page-editor-chrome/FrameMenus.js +7 -5
  481. package/dist/editor/page-editor-chrome/FrameMenus.js.map +1 -1
  482. package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.d.ts +2 -2
  483. package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.js +20 -39
  484. package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.js.map +1 -1
  485. package/dist/editor/page-editor-chrome/LockedFieldIndicator.d.ts +1 -1
  486. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +27 -21
  487. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js.map +1 -1
  488. package/dist/editor/page-editor-chrome/NoLayout.js +5 -3
  489. package/dist/editor/page-editor-chrome/NoLayout.js.map +1 -1
  490. package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +1 -1
  491. package/dist/editor/page-editor-chrome/PageEditorChrome.js +29 -23
  492. package/dist/editor/page-editor-chrome/PageEditorChrome.js.map +1 -1
  493. package/dist/editor/page-editor-chrome/PictureEditorOverlay.d.ts +1 -1
  494. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +24 -21
  495. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js.map +1 -1
  496. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +10 -4
  497. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  498. package/dist/editor/page-editor-chrome/PlaceholderDropZones.d.ts +1 -1
  499. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +11 -10
  500. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  501. package/dist/editor/page-editor-chrome/SpellCheckHighlightings.d.ts +12 -0
  502. package/dist/editor/page-editor-chrome/SpellCheckHighlightings.js +197 -0
  503. package/dist/editor/page-editor-chrome/SpellCheckHighlightings.js.map +1 -0
  504. package/dist/editor/page-editor-chrome/SuggestionHighlightings.d.ts +1 -1
  505. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js +226 -388
  506. package/dist/editor/page-editor-chrome/SuggestionHighlightings.js.map +1 -1
  507. package/dist/editor/page-editor-chrome/ValidationRulerMarks.d.ts +11 -0
  508. package/dist/editor/page-editor-chrome/ValidationRulerMarks.js +56 -0
  509. package/dist/editor/page-editor-chrome/ValidationRulerMarks.js.map +1 -0
  510. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.d.ts +1 -1
  511. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js +11 -8
  512. package/dist/editor/page-editor-chrome/VersionDiffHighlightings.js.map +1 -1
  513. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.d.ts +15 -2
  514. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +70 -9
  515. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
  516. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.d.ts +44 -0
  517. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.js +89 -0
  518. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.js.map +1 -0
  519. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.d.ts +17 -0
  520. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.js +53 -0
  521. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.js.map +1 -0
  522. package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +15 -0
  523. package/dist/editor/page-editor-chrome/overlay/geometry.js +40 -0
  524. package/dist/editor/page-editor-chrome/overlay/geometry.js.map +1 -1
  525. package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.d.ts +11 -0
  526. package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.js +84 -0
  527. package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.js.map +1 -0
  528. package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.d.ts +34 -0
  529. package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.js +229 -0
  530. package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.js.map +1 -0
  531. package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.d.ts +9 -0
  532. package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.js +34 -0
  533. package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.js.map +1 -0
  534. package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.d.ts +49 -0
  535. package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.js +241 -0
  536. package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.js.map +1 -0
  537. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +7 -0
  538. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js +63 -5
  539. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.js.map +1 -1
  540. package/dist/editor/page-editor-chrome/useBridgeRichTextFieldOptions.d.ts +12 -0
  541. package/dist/editor/page-editor-chrome/useBridgeRichTextFieldOptions.js +79 -0
  542. package/dist/editor/page-editor-chrome/useBridgeRichTextFieldOptions.js.map +1 -0
  543. package/dist/editor/page-editor-chrome/useComponentDragHandle.js +1 -1
  544. package/dist/editor/page-editor-chrome/useComponentDragHandle.js.map +1 -1
  545. package/dist/editor/page-editor-chrome/useDragInsertionGesture.js +1 -1
  546. package/dist/editor/page-editor-chrome/useDragInsertionGesture.js.map +1 -1
  547. package/dist/editor/page-editor-chrome/usePinnedHoveredComponentId.d.ts +1 -1
  548. package/dist/editor/page-editor-chrome/usePinnedHoveredComponentId.js +4 -2
  549. package/dist/editor/page-editor-chrome/usePinnedHoveredComponentId.js.map +1 -1
  550. package/dist/editor/page-viewer/CanvasOverviewRuler.d.ts +11 -0
  551. package/dist/editor/page-viewer/CanvasOverviewRuler.js +65 -0
  552. package/dist/editor/page-viewer/CanvasOverviewRuler.js.map +1 -0
  553. package/dist/editor/page-viewer/DeviceToolbar.d.ts +1 -1
  554. package/dist/editor/page-viewer/DeviceToolbar.js +8 -3
  555. package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -1
  556. package/dist/editor/page-viewer/DynamicRenderingsBar.d.ts +23 -0
  557. package/dist/editor/page-viewer/DynamicRenderingsBar.js +28 -0
  558. package/dist/editor/page-viewer/DynamicRenderingsBar.js.map +1 -0
  559. package/dist/editor/page-viewer/DynamicRenderingsStrip.d.ts +18 -0
  560. package/dist/editor/page-viewer/DynamicRenderingsStrip.js +29 -0
  561. package/dist/editor/page-viewer/DynamicRenderingsStrip.js.map +1 -0
  562. package/dist/editor/page-viewer/EditorForm.js +29 -24
  563. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  564. package/dist/editor/page-viewer/FeedbackMargin.d.ts +57 -0
  565. package/dist/editor/page-viewer/FeedbackMargin.js +378 -0
  566. package/dist/editor/page-viewer/FeedbackMargin.js.map +1 -0
  567. package/dist/editor/page-viewer/FeedbackMarginController.d.ts +76 -0
  568. package/dist/editor/page-viewer/FeedbackMarginController.js +241 -0
  569. package/dist/editor/page-viewer/FeedbackMarginController.js.map +1 -0
  570. package/dist/editor/page-viewer/FeedbackMarginMarker.d.ts +16 -0
  571. package/dist/editor/page-viewer/FeedbackMarginMarker.js +24 -0
  572. package/dist/editor/page-viewer/FeedbackMarginMarker.js.map +1 -0
  573. package/dist/editor/page-viewer/FeedbackMarginResizeHandle.d.ts +23 -0
  574. package/dist/editor/page-viewer/FeedbackMarginResizeHandle.js +105 -0
  575. package/dist/editor/page-viewer/FeedbackMarginResizeHandle.js.map +1 -0
  576. package/dist/editor/page-viewer/InteractivePreviewBar.d.ts +24 -0
  577. package/dist/editor/page-viewer/InteractivePreviewBar.js +31 -0
  578. package/dist/editor/page-viewer/InteractivePreviewBar.js.map +1 -0
  579. package/dist/editor/page-viewer/MiniMap.d.ts +9 -3
  580. package/dist/editor/page-viewer/MiniMap.js +50 -60
  581. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  582. package/dist/editor/page-viewer/MinimapDropTargets.d.ts +1 -1
  583. package/dist/editor/page-viewer/MinimapDropTargets.js +9 -7
  584. package/dist/editor/page-viewer/MinimapDropTargets.js.map +1 -1
  585. package/dist/editor/page-viewer/MobileCommentsPanel.d.ts +16 -0
  586. package/dist/editor/page-viewer/MobileCommentsPanel.js +112 -0
  587. package/dist/editor/page-viewer/MobileCommentsPanel.js.map +1 -0
  588. package/dist/editor/page-viewer/PageViewer.js +22 -67
  589. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  590. package/dist/editor/page-viewer/PageViewerFrame.d.ts +1 -0
  591. package/dist/editor/page-viewer/PageViewerFrame.js +610 -224
  592. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  593. package/dist/editor/page-viewer/RenderingAiCheck.d.ts +18 -0
  594. package/dist/editor/page-viewer/RenderingAiCheck.js +45 -0
  595. package/dist/editor/page-viewer/RenderingAiCheck.js.map +1 -0
  596. package/dist/editor/page-viewer/RenderingApprovalDialog.d.ts +32 -0
  597. package/dist/editor/page-viewer/RenderingApprovalDialog.js +191 -0
  598. package/dist/editor/page-viewer/RenderingApprovalDialog.js.map +1 -0
  599. package/dist/editor/page-viewer/SealedClientCodePreview.d.ts +17 -0
  600. package/dist/editor/page-viewer/SealedClientCodePreview.js +38 -0
  601. package/dist/editor/page-viewer/SealedClientCodePreview.js.map +1 -0
  602. package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +9 -0
  603. package/dist/editor/page-viewer/bridgeFieldPatch.js +21 -0
  604. package/dist/editor/page-viewer/bridgeFieldPatch.js.map +1 -1
  605. package/dist/editor/page-viewer/bridgeInlineEditSession.js +8 -0
  606. package/dist/editor/page-viewer/bridgeInlineEditSession.js.map +1 -1
  607. package/dist/editor/page-viewer/canvasFrameNavigation.d.ts +18 -0
  608. package/dist/editor/page-viewer/canvasFrameNavigation.js +36 -0
  609. package/dist/editor/page-viewer/canvasFrameNavigation.js.map +1 -0
  610. package/dist/editor/page-viewer/canvasLoadSettling.d.ts +42 -0
  611. package/dist/editor/page-viewer/canvasLoadSettling.js +46 -0
  612. package/dist/editor/page-viewer/canvasLoadSettling.js.map +1 -0
  613. package/dist/editor/page-viewer/canvasScrollHandoff.d.ts +34 -0
  614. package/dist/editor/page-viewer/canvasScrollHandoff.js +55 -0
  615. package/dist/editor/page-viewer/canvasScrollHandoff.js.map +1 -0
  616. package/dist/editor/page-viewer/feedbackMarginLayout.d.ts +119 -0
  617. package/dist/editor/page-viewer/feedbackMarginLayout.js +155 -0
  618. package/dist/editor/page-viewer/feedbackMarginLayout.js.map +1 -0
  619. package/dist/editor/page-viewer/feedbackMarginSources.d.ts +36 -0
  620. package/dist/editor/page-viewer/feedbackMarginSources.js +196 -0
  621. package/dist/editor/page-viewer/feedbackMarginSources.js.map +1 -0
  622. package/dist/editor/page-viewer/feedbackMarginWidth.d.ts +43 -0
  623. package/dist/editor/page-viewer/feedbackMarginWidth.js +107 -0
  624. package/dist/editor/page-viewer/feedbackMarginWidth.js.map +1 -0
  625. package/dist/editor/page-viewer/interactivePreview.d.ts +168 -0
  626. package/dist/editor/page-viewer/interactivePreview.js +344 -0
  627. package/dist/editor/page-viewer/interactivePreview.js.map +1 -0
  628. package/dist/editor/page-viewer/minimapViewport.js +5 -2
  629. package/dist/editor/page-viewer/minimapViewport.js.map +1 -1
  630. package/dist/editor/page-viewer/openPageItems.d.ts +29 -0
  631. package/dist/editor/page-viewer/openPageItems.js +73 -0
  632. package/dist/editor/page-viewer/openPageItems.js.map +1 -0
  633. package/dist/editor/page-viewer/overviewRuler.d.ts +128 -0
  634. package/dist/editor/page-viewer/overviewRuler.js +226 -0
  635. package/dist/editor/page-viewer/overviewRuler.js.map +1 -0
  636. package/dist/editor/page-viewer/pageViewContext.d.ts +99 -37
  637. package/dist/editor/page-viewer/pageViewContext.js +207 -238
  638. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  639. package/dist/editor/page-viewer/renderingApproval.d.ts +59 -0
  640. package/dist/editor/page-viewer/renderingApproval.js +186 -0
  641. package/dist/editor/page-viewer/renderingApproval.js.map +1 -0
  642. package/dist/editor/page-viewer/renderingChanges.d.ts +29 -0
  643. package/dist/editor/page-viewer/renderingChanges.js +40 -0
  644. package/dist/editor/page-viewer/renderingChanges.js.map +1 -0
  645. package/dist/editor/page-viewer/scrollIntoViewTextRanges.d.ts +23 -0
  646. package/dist/editor/page-viewer/scrollIntoViewTextRanges.js +26 -0
  647. package/dist/editor/page-viewer/scrollIntoViewTextRanges.js.map +1 -0
  648. package/dist/editor/page-viewer/useInteractivePreview.d.ts +77 -0
  649. package/dist/editor/page-viewer/useInteractivePreview.js +210 -0
  650. package/dist/editor/page-viewer/useInteractivePreview.js.map +1 -0
  651. package/dist/editor/pageModel.d.ts +12 -0
  652. package/dist/editor/personalization/ConditionTreeEditor.js +1 -1
  653. package/dist/editor/personalization/ConditionTreeEditor.js.map +1 -1
  654. package/dist/editor/personalization/PersonalizationPanel.js +1 -1
  655. package/dist/editor/personalization/PersonalizationPanel.js.map +1 -1
  656. package/dist/editor/reviews/CollapsibleText.d.ts +13 -0
  657. package/dist/editor/reviews/CollapsibleText.js +41 -0
  658. package/dist/editor/reviews/CollapsibleText.js.map +1 -0
  659. package/dist/editor/reviews/Comment.d.ts +10 -1
  660. package/dist/editor/reviews/Comment.js +47 -26
  661. package/dist/editor/reviews/Comment.js.map +1 -1
  662. package/dist/editor/reviews/CommentDisplayPopover.js +29 -25
  663. package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
  664. package/dist/editor/reviews/CommentEditor.d.ts +25 -1
  665. package/dist/editor/reviews/CommentEditor.js +130 -24
  666. package/dist/editor/reviews/CommentEditor.js.map +1 -1
  667. package/dist/editor/reviews/CommentPopover.d.ts +0 -4
  668. package/dist/editor/reviews/CommentPopover.js +4 -8
  669. package/dist/editor/reviews/CommentPopover.js.map +1 -1
  670. package/dist/editor/reviews/CommentQuote.d.ts +10 -1
  671. package/dist/editor/reviews/CommentQuote.js +15 -10
  672. package/dist/editor/reviews/CommentQuote.js.map +1 -1
  673. package/dist/editor/reviews/CommentTargetOutline.d.ts +13 -0
  674. package/dist/editor/reviews/CommentTargetOutline.js +21 -0
  675. package/dist/editor/reviews/CommentTargetOutline.js.map +1 -0
  676. package/dist/editor/reviews/CommentTargetPickerDomLayer.d.ts +7 -0
  677. package/dist/editor/reviews/CommentTargetPickerDomLayer.js +117 -0
  678. package/dist/editor/reviews/CommentTargetPickerDomLayer.js.map +1 -0
  679. package/dist/editor/reviews/CommentThreadAgentLink.d.ts +6 -1
  680. package/dist/editor/reviews/CommentThreadAgentLink.js +4 -4
  681. package/dist/editor/reviews/CommentThreadAgentLink.js.map +1 -1
  682. package/dist/editor/reviews/CommentThreadCard.d.ts +34 -0
  683. package/dist/editor/reviews/CommentThreadCard.js +156 -0
  684. package/dist/editor/reviews/CommentThreadCard.js.map +1 -0
  685. package/dist/editor/reviews/CommentView.d.ts +7 -1
  686. package/dist/editor/reviews/CommentView.js +24 -6
  687. package/dist/editor/reviews/CommentView.js.map +1 -1
  688. package/dist/editor/reviews/Comments.js +5 -14
  689. package/dist/editor/reviews/Comments.js.map +1 -1
  690. package/dist/editor/reviews/CreateReviewDialog.js +36 -9
  691. package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
  692. package/dist/editor/reviews/EditReviewSettingsDialog.js +1 -1
  693. package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
  694. package/dist/editor/reviews/FeedbackCard.d.ts +16 -1
  695. package/dist/editor/reviews/FeedbackCard.js +14 -3
  696. package/dist/editor/reviews/FeedbackCard.js.map +1 -1
  697. package/dist/editor/reviews/FeedbackFilters.d.ts +9 -5
  698. package/dist/editor/reviews/FeedbackFilters.js +15 -36
  699. package/dist/editor/reviews/FeedbackFilters.js.map +1 -1
  700. package/dist/editor/reviews/FeedbackModeIntro.d.ts +7 -1
  701. package/dist/editor/reviews/FeedbackModeIntro.js +11 -6
  702. package/dist/editor/reviews/FeedbackModeIntro.js.map +1 -1
  703. package/dist/editor/reviews/MentionText.d.ts +2 -1
  704. package/dist/editor/reviews/MentionText.js +5 -3
  705. package/dist/editor/reviews/MentionText.js.map +1 -1
  706. package/dist/editor/reviews/MultiReviewManager.js +18 -3
  707. package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
  708. package/dist/editor/reviews/ReviewItemsPanel.js +4 -0
  709. package/dist/editor/reviews/ReviewItemsPanel.js.map +1 -1
  710. package/dist/editor/reviews/SuggestedEdit.d.ts +10 -1
  711. package/dist/editor/reviews/SuggestedEdit.js +77 -10
  712. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  713. package/dist/editor/reviews/SuggestionCommentThread.d.ts +5 -1
  714. package/dist/editor/reviews/SuggestionCommentThread.js +48 -17
  715. package/dist/editor/reviews/SuggestionCommentThread.js.map +1 -1
  716. package/dist/editor/reviews/SuggestionDisplayPopover.d.ts +1 -3
  717. package/dist/editor/reviews/SuggestionDisplayPopover.js +2 -7
  718. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  719. package/dist/editor/reviews/SuggestionThreadCard.d.ts +19 -0
  720. package/dist/editor/reviews/SuggestionThreadCard.js +25 -0
  721. package/dist/editor/reviews/SuggestionThreadCard.js.map +1 -0
  722. package/dist/editor/reviews/addCommentOnTarget.d.ts +22 -0
  723. package/dist/editor/reviews/addCommentOnTarget.js +32 -0
  724. package/dist/editor/reviews/addCommentOnTarget.js.map +1 -0
  725. package/dist/editor/reviews/applySuggestedEditActions.js +7 -1
  726. package/dist/editor/reviews/applySuggestedEditActions.js.map +1 -1
  727. package/dist/editor/reviews/balloonLayout.d.ts +51 -0
  728. package/dist/editor/reviews/balloonLayout.js +101 -0
  729. package/dist/editor/reviews/balloonLayout.js.map +1 -0
  730. package/dist/editor/reviews/commentImages.d.ts +1 -2
  731. package/dist/editor/reviews/commentImages.js +1 -37
  732. package/dist/editor/reviews/commentImages.js.map +1 -1
  733. package/dist/editor/reviews/commentTargetPicker.d.ts +114 -0
  734. package/dist/editor/reviews/commentTargetPicker.js +153 -0
  735. package/dist/editor/reviews/commentTargetPicker.js.map +1 -0
  736. package/dist/editor/reviews/feedbackAvatar.js +2 -1
  737. package/dist/editor/reviews/feedbackAvatar.js.map +1 -1
  738. package/dist/editor/reviews/feedbackBalloonDate.d.ts +8 -0
  739. package/dist/editor/reviews/feedbackBalloonDate.js +22 -0
  740. package/dist/editor/reviews/feedbackBalloonDate.js.map +1 -0
  741. package/dist/editor/reviews/feedbackDrafts.d.ts +49 -0
  742. package/dist/editor/reviews/feedbackDrafts.js +74 -0
  743. package/dist/editor/reviews/feedbackDrafts.js.map +1 -0
  744. package/dist/editor/reviews/feedbackHoverState.d.ts +18 -0
  745. package/dist/editor/reviews/feedbackHoverState.js +35 -0
  746. package/dist/editor/reviews/feedbackHoverState.js.map +1 -0
  747. package/dist/editor/reviews/feedbackPersonFilter.d.ts +3 -0
  748. package/dist/editor/reviews/feedbackPersonFilter.js +32 -0
  749. package/dist/editor/reviews/feedbackPersonFilter.js.map +1 -0
  750. package/dist/editor/reviews/feedbackSelection.js +7 -3
  751. package/dist/editor/reviews/feedbackSelection.js.map +1 -1
  752. package/dist/editor/reviews/feedbackThreadSelection.d.ts +10 -0
  753. package/dist/editor/reviews/feedbackThreadSelection.js +31 -0
  754. package/dist/editor/reviews/feedbackThreadSelection.js.map +1 -0
  755. package/dist/editor/reviews/feedbackThreads.d.ts +50 -0
  756. package/dist/editor/reviews/feedbackThreads.js +135 -0
  757. package/dist/editor/reviews/feedbackThreads.js.map +1 -0
  758. package/dist/editor/reviews/feedbackWheelForwarding.d.ts +34 -0
  759. package/dist/editor/reviews/feedbackWheelForwarding.js +108 -0
  760. package/dist/editor/reviews/feedbackWheelForwarding.js.map +1 -0
  761. package/dist/editor/reviews/openCommentsFeedback.d.ts +1 -1
  762. package/dist/editor/reviews/openCommentsFeedback.js +2 -1
  763. package/dist/editor/reviews/openCommentsFeedback.js.map +1 -1
  764. package/dist/editor/reviews/pendingReviewSelection.d.ts +13 -0
  765. package/dist/editor/reviews/pendingReviewSelection.js +29 -0
  766. package/dist/editor/reviews/pendingReviewSelection.js.map +1 -0
  767. package/dist/editor/reviews/requestReview.d.ts +27 -0
  768. package/dist/editor/reviews/requestReview.js +36 -0
  769. package/dist/editor/reviews/requestReview.js.map +1 -0
  770. package/dist/editor/reviews/reviewUrlScope.d.ts +23 -0
  771. package/dist/editor/reviews/reviewUrlScope.js +86 -0
  772. package/dist/editor/reviews/reviewUrlScope.js.map +1 -0
  773. package/dist/editor/reviews/scrollWithin.d.ts +29 -0
  774. package/dist/editor/reviews/scrollWithin.js +87 -0
  775. package/dist/editor/reviews/scrollWithin.js.map +1 -0
  776. package/dist/editor/reviews/subtreeFeedback.d.ts +57 -0
  777. package/dist/editor/reviews/subtreeFeedback.js +137 -0
  778. package/dist/editor/reviews/subtreeFeedback.js.map +1 -0
  779. package/dist/editor/reviews/useCommentImagePaste.d.ts +9 -1
  780. package/dist/editor/reviews/useCommentImagePaste.js +68 -4
  781. package/dist/editor/reviews/useCommentImagePaste.js.map +1 -1
  782. package/dist/editor/reviews/useFeedbackThreads.d.ts +35 -0
  783. package/dist/editor/reviews/useFeedbackThreads.js +137 -0
  784. package/dist/editor/reviews/useFeedbackThreads.js.map +1 -0
  785. package/dist/editor/reviews/useMeasuredHeights.d.ts +25 -0
  786. package/dist/editor/reviews/useMeasuredHeights.js +176 -0
  787. package/dist/editor/reviews/useMeasuredHeights.js.map +1 -0
  788. package/dist/editor/reviews/usePendingFeedbackFocus.d.ts +7 -0
  789. package/dist/editor/reviews/usePendingFeedbackFocus.js +42 -0
  790. package/dist/editor/reviews/usePendingFeedbackFocus.js.map +1 -0
  791. package/dist/editor/services/agentService.d.ts +101 -5
  792. package/dist/editor/services/agentService.js +16 -0
  793. package/dist/editor/services/agentService.js.map +1 -1
  794. package/dist/editor/services/aiService.d.ts +2 -0
  795. package/dist/editor/services/aiService.js.map +1 -1
  796. package/dist/editor/services/contentService.d.ts +11 -1
  797. package/dist/editor/services/contentService.js +2 -1
  798. package/dist/editor/services/contentService.js.map +1 -1
  799. package/dist/editor/services/editService.d.ts +2 -0
  800. package/dist/editor/services/editService.js.map +1 -1
  801. package/dist/editor/services/indexService.d.ts +1 -0
  802. package/dist/editor/services/indexService.js +4 -0
  803. package/dist/editor/services/indexService.js.map +1 -1
  804. package/dist/editor/services/mcpAccessService.d.ts +93 -0
  805. package/dist/editor/services/mcpAccessService.js +41 -0
  806. package/dist/editor/services/mcpAccessService.js.map +1 -0
  807. package/dist/editor/services/previewTokenService.d.ts +14 -0
  808. package/dist/editor/services/previewTokenService.js +34 -0
  809. package/dist/editor/services/previewTokenService.js.map +1 -0
  810. package/dist/editor/services/renderingsService.d.ts +117 -0
  811. package/dist/editor/services/renderingsService.js +245 -0
  812. package/dist/editor/services/renderingsService.js.map +1 -0
  813. package/dist/editor/services/reviewsService.d.ts +6 -1
  814. package/dist/editor/services/reviewsService.js +14 -6
  815. package/dist/editor/services/reviewsService.js.map +1 -1
  816. package/dist/editor/services/serviceHelper.d.ts +17 -1
  817. package/dist/editor/services/serviceHelper.js +67 -12
  818. package/dist/editor/services/serviceHelper.js.map +1 -1
  819. package/dist/editor/services/spellCheckService.d.ts +13 -0
  820. package/dist/editor/services/spellCheckService.js +33 -0
  821. package/dist/editor/services/spellCheckService.js.map +1 -0
  822. package/dist/editor/services/suggestedEditsService.d.ts +1 -0
  823. package/dist/editor/services/suggestedEditsService.js +7 -0
  824. package/dist/editor/services/suggestedEditsService.js.map +1 -1
  825. package/dist/editor/settings/MigrationJournalCard.js +2 -2
  826. package/dist/editor/settings/MigrationJournalCard.js.map +1 -1
  827. package/dist/editor/settings/StatusSummary.js +5 -2
  828. package/dist/editor/settings/StatusSummary.js.map +1 -1
  829. package/dist/editor/settings/index/CollectionWarningsDisplay.js +1 -1
  830. package/dist/editor/settings/index/CollectionWarningsDisplay.js.map +1 -1
  831. package/dist/editor/settings/index/IndexGenerationsSection.d.ts +4 -5
  832. package/dist/editor/settings/index/IndexGenerationsSection.js +83 -33
  833. package/dist/editor/settings/index/IndexGenerationsSection.js.map +1 -1
  834. package/dist/editor/settings/panels/AgentProfileConfigPanel.js +1 -1
  835. package/dist/editor/settings/panels/AgentProfileConfigPanel.js.map +1 -1
  836. package/dist/editor/settings/panels/AgentToolsPanel.js +1 -1
  837. package/dist/editor/settings/panels/AgentToolsPanel.js.map +1 -1
  838. package/dist/editor/settings/panels/JavaScriptToolAgentPanel.js +1 -1
  839. package/dist/editor/settings/panels/JavaScriptToolAgentPanel.js.map +1 -1
  840. package/dist/editor/settings/panels/McpAccessPanel.d.ts +7 -0
  841. package/dist/editor/settings/panels/McpAccessPanel.js +96 -0
  842. package/dist/editor/settings/panels/McpAccessPanel.js.map +1 -0
  843. package/dist/editor/settings/panels/McpAccessSettingsView.d.ts +8 -0
  844. package/dist/editor/settings/panels/McpAccessSettingsView.js +221 -0
  845. package/dist/editor/settings/panels/McpAccessSettingsView.js.map +1 -0
  846. package/dist/editor/settings/panels/ModelConfigPanel.js +1 -0
  847. package/dist/editor/settings/panels/ModelConfigPanel.js.map +1 -1
  848. package/dist/editor/settings/panels/ModelsPanel.js +60 -6
  849. package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
  850. package/dist/editor/settings/panels/PersistentLogsPanel.js +2 -1
  851. package/dist/editor/settings/panels/PersistentLogsPanel.js.map +1 -1
  852. package/dist/editor/settings/panels/ProjectTemplateAgentPanel.js +1 -1
  853. package/dist/editor/settings/panels/ProjectTemplateAgentPanel.js.map +1 -1
  854. package/dist/editor/settings/panels/ProvidersPanel.js +2 -1
  855. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  856. package/dist/editor/settings/panels/SearchConfigPanel.js +6 -5
  857. package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
  858. package/dist/editor/settings/panels/SpellCheckPanel.d.ts +8 -0
  859. package/dist/editor/settings/panels/SpellCheckPanel.js +253 -0
  860. package/dist/editor/settings/panels/SpellCheckPanel.js.map +1 -0
  861. package/dist/editor/settings/panels/StatusPanel.js +5 -6
  862. package/dist/editor/settings/panels/StatusPanel.js.map +1 -1
  863. package/dist/editor/settings/panels/UserPreferencesPanel.js +5 -2
  864. package/dist/editor/settings/panels/UserPreferencesPanel.js.map +1 -1
  865. package/dist/editor/settings/panels/index.d.ts +2 -0
  866. package/dist/editor/settings/panels/index.js +2 -0
  867. package/dist/editor/settings/panels/index.js.map +1 -1
  868. package/dist/editor/sidebar/ComponentPalette.js +7 -3
  869. package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
  870. package/dist/editor/sidebar/ComponentTree.d.ts +1 -1
  871. package/dist/editor/sidebar/ComponentTree.js +32 -56
  872. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  873. package/dist/editor/sidebar/DictionaryEditor.js +2 -1
  874. package/dist/editor/sidebar/DictionaryEditor.js.map +1 -1
  875. package/dist/editor/sidebar/EditHistory.js +5 -4
  876. package/dist/editor/sidebar/EditHistory.js.map +1 -1
  877. package/dist/editor/sidebar/FeedbackSidebar.d.ts +7 -0
  878. package/dist/editor/sidebar/FeedbackSidebar.js +300 -0
  879. package/dist/editor/sidebar/FeedbackSidebar.js.map +1 -0
  880. package/dist/editor/sidebar/OperationDetailsContent.js +50 -0
  881. package/dist/editor/sidebar/OperationDetailsContent.js.map +1 -1
  882. package/dist/editor/sidebar/OperationItem.js +2 -0
  883. package/dist/editor/sidebar/OperationItem.js.map +1 -1
  884. package/dist/editor/sidebar/Sessions.js +3 -1
  885. package/dist/editor/sidebar/Sessions.js.map +1 -1
  886. package/dist/editor/sidebar/Validation.js +1 -1
  887. package/dist/editor/sidebar/Validation.js.map +1 -1
  888. package/dist/editor/sidebar/Workbox.js +3 -108
  889. package/dist/editor/sidebar/Workbox.js.map +1 -1
  890. package/dist/editor/sidebar/liveComponentThumbnails.d.ts +1 -1
  891. package/dist/editor/sidebar/liveComponentThumbnails.js +19 -14
  892. package/dist/editor/sidebar/liveComponentThumbnails.js.map +1 -1
  893. package/dist/editor/spellcheck/canvasSpellCheckContextMenu.d.ts +30 -0
  894. package/dist/editor/spellcheck/canvasSpellCheckContextMenu.js +69 -0
  895. package/dist/editor/spellcheck/canvasSpellCheckContextMenu.js.map +1 -0
  896. package/dist/editor/spellcheck/htmlSpellDocument.d.ts +60 -0
  897. package/dist/editor/spellcheck/htmlSpellDocument.js +181 -0
  898. package/dist/editor/spellcheck/htmlSpellDocument.js.map +1 -0
  899. package/dist/editor/spellcheck/htmlSpellTokenizer.d.ts +45 -0
  900. package/dist/editor/spellcheck/htmlSpellTokenizer.js +277 -0
  901. package/dist/editor/spellcheck/htmlSpellTokenizer.js.map +1 -0
  902. package/dist/editor/spellcheck/replacementGuard.d.ts +27 -0
  903. package/dist/editor/spellcheck/replacementGuard.js +29 -0
  904. package/dist/editor/spellcheck/replacementGuard.js.map +1 -0
  905. package/dist/editor/spellcheck/spellCheckCanvasStore.d.ts +17 -0
  906. package/dist/editor/spellcheck/spellCheckCanvasStore.js +37 -0
  907. package/dist/editor/spellcheck/spellCheckCanvasStore.js.map +1 -0
  908. package/dist/editor/spellcheck/spellCheckCanvasTargets.d.ts +71 -0
  909. package/dist/editor/spellcheck/spellCheckCanvasTargets.js +126 -0
  910. package/dist/editor/spellcheck/spellCheckCanvasTargets.js.map +1 -0
  911. package/dist/editor/spellcheck/spellCheckClient.d.ts +66 -0
  912. package/dist/editor/spellcheck/spellCheckClient.js +0 -0
  913. package/dist/editor/spellcheck/spellCheckClient.js.map +1 -0
  914. package/dist/editor/spellcheck/spellCheckContextMenu.d.ts +52 -0
  915. package/dist/editor/spellcheck/spellCheckContextMenu.js +120 -0
  916. package/dist/editor/spellcheck/spellCheckContextMenu.js.map +1 -0
  917. package/dist/editor/spellcheck/spellCheckReplace.d.ts +8 -0
  918. package/dist/editor/spellcheck/spellCheckReplace.js +20 -0
  919. package/dist/editor/spellcheck/spellCheckReplace.js.map +1 -0
  920. package/dist/editor/spellcheck/spellCheckStyles.d.ts +11 -0
  921. package/dist/editor/spellcheck/spellCheckStyles.js +12 -0
  922. package/dist/editor/spellcheck/spellCheckStyles.js.map +1 -0
  923. package/dist/editor/spellcheck/spellCheckTypes.d.ts +94 -0
  924. package/dist/editor/spellcheck/spellCheckTypes.js +2 -0
  925. package/dist/editor/spellcheck/spellCheckTypes.js.map +1 -0
  926. package/dist/editor/spellcheck/textMarkHitTest.d.ts +14 -0
  927. package/dist/editor/spellcheck/textMarkHitTest.js +39 -0
  928. package/dist/editor/spellcheck/textMarkHitTest.js.map +1 -0
  929. package/dist/editor/spellcheck/useSpellCheck.d.ts +16 -0
  930. package/dist/editor/spellcheck/useSpellCheck.js +57 -0
  931. package/dist/editor/spellcheck/useSpellCheck.js.map +1 -0
  932. package/dist/editor/ui/DynamicRenderingsPublishWarning.d.ts +14 -0
  933. package/dist/editor/ui/DynamicRenderingsPublishWarning.js +40 -0
  934. package/dist/editor/ui/DynamicRenderingsPublishWarning.js.map +1 -0
  935. package/dist/editor/ui/ItemNameDialogNew.js +11 -2
  936. package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
  937. package/dist/editor/ui/ItemSearch.d.ts +2 -0
  938. package/dist/editor/ui/ItemSearch.js +2 -2
  939. package/dist/editor/ui/ItemSearch.js.map +1 -1
  940. package/dist/editor/ui/PublishDialog.d.ts +2 -0
  941. package/dist/editor/ui/PublishDialog.js +4 -1
  942. package/dist/editor/ui/PublishDialog.js.map +1 -1
  943. package/dist/editor/ui/PublishItemDialog.js +3 -2
  944. package/dist/editor/ui/PublishItemDialog.js.map +1 -1
  945. package/dist/editor/ui/PublishReadinessSummary.js +1 -1
  946. package/dist/editor/ui/PublishReadinessSummary.js.map +1 -1
  947. package/dist/editor/ui/PublishRestrictionsDialog.d.ts +33 -0
  948. package/dist/editor/ui/PublishRestrictionsDialog.js +208 -38
  949. package/dist/editor/ui/PublishRestrictionsDialog.js.map +1 -1
  950. package/dist/editor/ui/RootItemPicker.d.ts +18 -0
  951. package/dist/editor/ui/RootItemPicker.js +112 -0
  952. package/dist/editor/ui/RootItemPicker.js.map +1 -0
  953. package/dist/editor/ui/WorkboxItemsTable.js +1 -1
  954. package/dist/editor/ui/WorkboxItemsTable.js.map +1 -1
  955. package/dist/editor/utils/dataTransferImages.d.ts +7 -0
  956. package/dist/editor/utils/dataTransferImages.js +43 -0
  957. package/dist/editor/utils/dataTransferImages.js.map +1 -0
  958. package/dist/editor/utils/itemConverters.js +9 -0
  959. package/dist/editor/utils/itemConverters.js.map +1 -1
  960. package/dist/editor/utils/keyboardNavigation.js +38 -4
  961. package/dist/editor/utils/keyboardNavigation.js.map +1 -1
  962. package/dist/editor/utils.d.ts +4 -4
  963. package/dist/editor/utils.js +9 -8
  964. package/dist/editor/utils.js.map +1 -1
  965. package/dist/editor/validation/navigateToValidationIssue.d.ts +2 -2
  966. package/dist/editor/validation/navigateToValidationIssue.js +1 -1
  967. package/dist/editor/validation/navigateToValidationIssue.js.map +1 -1
  968. package/dist/editor/validation/validationRulerIssues.d.ts +17 -0
  969. package/dist/editor/validation/validationRulerIssues.js +44 -0
  970. package/dist/editor/validation/validationRulerIssues.js.map +1 -0
  971. package/dist/editor/views/CompareView.js +3 -4
  972. package/dist/editor/views/CompareView.js.map +1 -1
  973. package/dist/editor/views/EditorSlot.js +10 -4
  974. package/dist/editor/views/EditorSlot.js.map +1 -1
  975. package/dist/editor/views/ItemEditor.d.ts +3 -1
  976. package/dist/editor/views/ItemEditor.js +43 -38
  977. package/dist/editor/views/ItemEditor.js.map +1 -1
  978. package/dist/editor/views/ItemEditorPane.js +3 -3
  979. package/dist/editor/views/ItemEditorPane.js.map +1 -1
  980. package/dist/editor/views/SingleEditView.js +10 -32
  981. package/dist/editor/views/SingleEditView.js.map +1 -1
  982. package/dist/editor/views/editorSlotContext.js +62 -90
  983. package/dist/editor/views/editorSlotContext.js.map +1 -1
  984. package/dist/index.d.ts +10 -5
  985. package/dist/index.js +8 -4
  986. package/dist/index.js.map +1 -1
  987. package/dist/licensing/FeatureGate.js +1 -1
  988. package/dist/licensing/FeatureGate.js.map +1 -1
  989. package/dist/licensing/LicenseContext.js +31 -17
  990. package/dist/licensing/LicenseContext.js.map +1 -1
  991. package/dist/revision.d.ts +2 -2
  992. package/dist/revision.js +2 -2
  993. package/dist/setup/services/setupWizardService.d.ts +6 -2
  994. package/dist/setup/services/setupWizardService.js +10 -0
  995. package/dist/setup/services/setupWizardService.js.map +1 -1
  996. package/dist/setup/wizard/steps/AddModelDialog.js +1 -0
  997. package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -1
  998. package/dist/setup/wizard/steps/ImportModelDialog.js +2 -1
  999. package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
  1000. package/dist/splash-screen/ModernSplashScreen.js +4 -3
  1001. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  1002. package/dist/splash-screen/RecentPages.js +5 -2
  1003. package/dist/splash-screen/RecentPages.js.map +1 -1
  1004. package/dist/task-board/TaskBoardWorkspace.js +49 -12
  1005. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  1006. package/dist/task-board/components/GoalsMatrix.js +1 -1
  1007. package/dist/task-board/components/GoalsMatrix.js.map +1 -1
  1008. package/dist/task-board/components/IssuePanel.js +4 -4
  1009. package/dist/task-board/components/IssuePanel.js.map +1 -1
  1010. package/dist/task-board/components/ProjectBudgetBanner.js +1 -1
  1011. package/dist/task-board/components/ProjectBudgetBanner.js.map +1 -1
  1012. package/dist/task-board/components/ProjectGoalsPanel.js +1 -1
  1013. package/dist/task-board/components/ProjectGoalsPanel.js.map +1 -1
  1014. package/dist/task-board/components/TaskDetailPanel.js +18 -8
  1015. package/dist/task-board/components/TaskDetailPanel.js.map +1 -1
  1016. package/dist/task-board/components/WizardCommunicationCards.js +1 -1
  1017. package/dist/task-board/components/WizardCommunicationCards.js.map +1 -1
  1018. package/dist/task-board/services/taskService.d.ts +1 -2
  1019. package/dist/task-board/services/taskService.js +0 -3
  1020. package/dist/task-board/services/taskService.js.map +1 -1
  1021. package/dist/task-board/taskBlockers.d.ts +10 -0
  1022. package/dist/task-board/taskBlockers.js +66 -0
  1023. package/dist/task-board/taskBlockers.js.map +1 -0
  1024. package/dist/task-board/types.d.ts +0 -7
  1025. package/dist/task-board/utils/projectDashboardModel.js +7 -1
  1026. package/dist/task-board/utils/projectDashboardModel.js.map +1 -1
  1027. package/dist/task-board/views/DependencyGraphView.d.ts +22 -0
  1028. package/dist/task-board/views/DependencyGraphView.js +111 -14
  1029. package/dist/task-board/views/DependencyGraphView.js.map +1 -1
  1030. package/dist/task-board/views/KanbanView.js +8 -10
  1031. package/dist/task-board/views/KanbanView.js.map +1 -1
  1032. package/dist/task-board/views/ProjectDashboardView.js +5 -13
  1033. package/dist/task-board/views/ProjectDashboardView.js.map +1 -1
  1034. package/dist/tour/Tour.js +4 -1
  1035. package/dist/tour/Tour.js.map +1 -1
  1036. package/dist/tour/sandbox-tour-copy.d.ts +8 -0
  1037. package/dist/tour/sandbox-tour-copy.js +8 -0
  1038. package/dist/tour/sandbox-tour-copy.js.map +1 -1
  1039. package/dist/tour/sandbox-tour.d.ts +3 -0
  1040. package/dist/tour/sandbox-tour.js +107 -3
  1041. package/dist/tour/sandbox-tour.js.map +1 -1
  1042. package/dist/types.d.ts +85 -1
  1043. package/package.json +6 -2
  1044. package/styles.css +17 -0
  1045. package/dist/editor/page-editor-chrome/bridgeLinkValue.d.ts +0 -10
  1046. package/dist/editor/page-editor-chrome/bridgeLinkValue.js +0 -55
  1047. package/dist/editor/page-editor-chrome/bridgeLinkValue.js.map +0 -1
@@ -7,9 +7,8 @@ import { Button } from "../../components/ui/button";
7
7
  import { CloseButton } from "../../components/ui/close-button";
8
8
  import { Textarea } from "../../components/ui/textarea";
9
9
  import { Tooltip, TooltipContent, TooltipTrigger, } from "../../components/ui/tooltip";
10
- import DialogButtons from "../ui/DialogButtons";
11
10
  import { Popover, PopoverContent, PopoverTrigger, } from "../../components/ui/popover";
12
- import { Check, ChevronDown, Cpu, X, Upload, Loader2, Image as ImageIcon, FolderOpen, FolderPlus, Lightbulb, Sparkles, Search, Plus, } from "lucide-react";
11
+ import { AlertCircle, ArrowUp, Check, ChevronDown, Cpu, X, Upload, Loader2, Image as ImageIcon, ImagePlus, FolderOpen, FolderPlus, Lightbulb, Sparkles, Search, } from "lucide-react";
13
12
  import { cn } from "../../lib/utils";
14
13
  import { useEditContext, useEditContextRef } from "../client/editContext";
15
14
  import { closeAgent, startSuggestionAgent, awaitAgentResponse, } from "../services/agentService";
@@ -52,13 +51,94 @@ export function formatFolderPath(path) {
52
51
  }
53
52
  return segments.join(" / ");
54
53
  }
54
+ const MODEL_NAME_ACRONYMS = {
55
+ ai: "AI",
56
+ gpt: "GPT",
57
+ hd: "HD",
58
+ sd: "SD",
59
+ sdxl: "SDXL",
60
+ xl: "XL",
61
+ };
62
+ /**
63
+ * Turns an API model id into a readable name, dropping the provider prefix:
64
+ * "google/gemini-3.1-flash-image" -> "Gemini 3.1 Flash Image",
65
+ * "gpt-image-1-mini" -> "GPT Image 1 Mini".
66
+ * Names that already read as display names (contain spaces) stay unchanged.
67
+ */
68
+ export function formatImageModelName(name) {
69
+ const trimmed = (name || "").trim();
70
+ if (!trimmed || /\s/.test(trimmed))
71
+ return trimmed;
72
+ const modelPart = trimmed.slice(trimmed.lastIndexOf("/") + 1);
73
+ const words = modelPart.split(/[-_]+/).filter(Boolean);
74
+ if (words.length === 0)
75
+ return trimmed;
76
+ return words
77
+ .map((word) => {
78
+ const acronym = MODEL_NAME_ACRONYMS[word.toLowerCase()];
79
+ if (acronym)
80
+ return acronym;
81
+ return word.charAt(0).toUpperCase() + word.slice(1);
82
+ })
83
+ .join(" ");
84
+ }
85
+ /**
86
+ * One-line message for a failed service call. A bare summary such as
87
+ * "Forbidden" says nothing, so the details are appended when they add to it.
88
+ */
89
+ export function describeServiceError(result, fallback) {
90
+ const summary = result.summary?.trim();
91
+ const details = result.details?.trim();
92
+ if (summary && details && details !== summary) {
93
+ return `${summary}: ${details}`;
94
+ }
95
+ return summary || details || fallback;
96
+ }
97
+ /** Label for the submit shortcut, matching the platform's modifier key. */
98
+ function getSubmitShortcutLabel() {
99
+ if (typeof navigator === "undefined")
100
+ return "Ctrl+Enter";
101
+ return /Mac|iPhone|iPad|iPod/i.test(navigator.userAgent)
102
+ ? "⌘Enter"
103
+ : "Ctrl+Enter";
104
+ }
105
+ /**
106
+ * Ratios every configured image provider can honour. OpenRouter passes them
107
+ * through; the OpenAI client maps them to its closest fixed size.
108
+ */
109
+ export const ASPECT_RATIO_OPTIONS = [
110
+ { value: "1:1", description: "Square", ratio: 1 },
111
+ { value: "4:3", description: "Landscape", ratio: 4 / 3 },
112
+ { value: "3:2", description: "Landscape", ratio: 3 / 2 },
113
+ { value: "16:9", description: "Wide", ratio: 16 / 9 },
114
+ { value: "3:4", description: "Portrait", ratio: 3 / 4 },
115
+ { value: "2:3", description: "Portrait", ratio: 2 / 3 },
116
+ { value: "9:16", description: "Tall", ratio: 9 / 16 },
117
+ ];
118
+ /** Landscape is the safer default for web imagery when nothing else is known. */
119
+ const DEFAULT_ASPECT_RATIO = "3:2";
120
+ /** The option closest to a width / height ratio, or undefined for no ratio. */
121
+ export function nearestAspectRatio(ratio) {
122
+ if (!ratio || !Number.isFinite(ratio) || ratio <= 0)
123
+ return undefined;
124
+ let best;
125
+ let bestDistance = Number.POSITIVE_INFINITY;
126
+ for (const option of ASPECT_RATIO_OPTIONS) {
127
+ const distance = Math.abs(Math.log(option.ratio / ratio));
128
+ if (distance < bestDistance) {
129
+ best = option;
130
+ bestDistance = distance;
131
+ }
132
+ }
133
+ return best;
134
+ }
55
135
  const IMAGE_MODEL_STORAGE_KEY = "aiImageEditor.selectedModelId";
56
136
  const AI_IMAGE_EDITOR_OVERLAY_ID = "ai-image-editor";
57
137
  /** /sitecore/media library */
58
138
  const MEDIA_LIBRARY_ROOT_ID = "3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1";
59
139
  /** Media Folder template */
60
140
  const MEDIA_FOLDER_TEMPLATE_ID = "FE5DD826-48C6-436D-B87A-7C4210C7413B";
61
- export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fieldDescriptor, initialPrompt = "", originalRawValue, variantName, currentImageSrc, currentMediaItemId, }, ref) => {
141
+ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fieldDescriptor, initialPrompt = "", originalRawValue, variantName, currentImageSrc, currentMediaItemId, lockedAspectRatio, }, ref) => {
62
142
  const editContext = useEditContext();
63
143
  const editContextRef = useEditContextRef();
64
144
  const itemsRepository = editContext?.itemsRepository;
@@ -80,14 +160,59 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
80
160
  const [uploading, setUploading] = useState(false);
81
161
  const [browsingMedia, setBrowsingMedia] = useState(false);
82
162
  const initialImageLoadedRef = useRef(false);
83
- // Prompt state
84
- const [modifyPrompt, setModifyPrompt] = useState(initialPrompt);
85
- const [generatePrompt, setGeneratePrompt] = useState("");
163
+ // One prompt for both modes: text typed before adding an image carries
164
+ // over as the edit instruction instead of being hidden.
165
+ const [prompt, setPrompt] = useState(initialPrompt);
166
+ const promptRef = useRef(null);
86
167
  // Image model state
87
168
  const [imageModels, setImageModels] = useState([]);
88
169
  const [selectedImageModelId, setSelectedImageModelId] = useState("");
89
170
  const [imageModelsLoading, setImageModelsLoading] = useState(false);
171
+ // Why the model list is empty (request failed or nothing configured for
172
+ // this user); bumping the reload key fetches the list again.
173
+ const [imageModelsError, setImageModelsError] = useState(null);
174
+ const [imageModelsReloadKey, setImageModelsReloadKey] = useState(0);
90
175
  const [imageModelPopoverOpen, setImageModelPopoverOpen] = useState(false);
176
+ // Output aspect ratio: the variant's lock wins, then the source image's
177
+ // own ratio in edit mode, then a landscape default. A manual choice is
178
+ // never overridden by a later automatic one.
179
+ const lockedAspectRatioOption = useMemo(() => nearestAspectRatio(lockedAspectRatio), [lockedAspectRatio]);
180
+ const [aspectRatio, setAspectRatio] = useState(() => lockedAspectRatioOption?.value ?? DEFAULT_ASPECT_RATIO);
181
+ const aspectRatioManuallySetRef = useRef(false);
182
+ const [aspectRatioPopoverOpen, setAspectRatioPopoverOpen] = useState(false);
183
+ const [addImagePopoverOpen, setAddImagePopoverOpen] = useState(false);
184
+ // True once the field's current image has been fetched (or that fetch
185
+ // failed), so the dialog knows whether it is editing or generating.
186
+ const [initialImageSettled, setInitialImageSettled] = useState(false);
187
+ useEffect(() => {
188
+ if (!lockedAspectRatioOption || aspectRatioManuallySetRef.current)
189
+ return;
190
+ setAspectRatio(lockedAspectRatioOption.value);
191
+ }, [lockedAspectRatioOption]);
192
+ const firstImageUrl = images[0]?.thumbnailUrl;
193
+ useEffect(() => {
194
+ if (!firstImageUrl ||
195
+ lockedAspectRatioOption ||
196
+ aspectRatioManuallySetRef.current ||
197
+ typeof Image === "undefined") {
198
+ return;
199
+ }
200
+ let cancelled = false;
201
+ const probe = new Image();
202
+ probe.onload = () => {
203
+ if (cancelled || aspectRatioManuallySetRef.current)
204
+ return;
205
+ const option = nearestAspectRatio(probe.naturalHeight > 0
206
+ ? probe.naturalWidth / probe.naturalHeight
207
+ : undefined);
208
+ if (option)
209
+ setAspectRatio(option.value);
210
+ };
211
+ probe.src = firstImageUrl;
212
+ return () => {
213
+ cancelled = true;
214
+ };
215
+ }, [firstImageUrl, lockedAspectRatioOption]);
91
216
  // Suggestion state
92
217
  const [suggesting, setSuggesting] = useState(false);
93
218
  // Submission state
@@ -167,7 +292,8 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
167
292
  ]);
168
293
  const imageModelOptions = useMemo(() => imageModels.map((model) => ({
169
294
  value: model.id,
170
- label: model.name || model.id,
295
+ label: formatImageModelName(model.name || model.id),
296
+ rawName: model.name || model.id,
171
297
  description: model.providerName
172
298
  ? model.isDefault
173
299
  ? `${model.providerName} - Default`
@@ -192,6 +318,7 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
192
318
  let cancelled = false;
193
319
  const loadImageModels = async () => {
194
320
  setImageModelsLoading(true);
321
+ setImageModelsError(null);
195
322
  try {
196
323
  const result = await getImageModels();
197
324
  if (cancelled)
@@ -199,9 +326,13 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
199
326
  if (result.type !== "success" || !result.data) {
200
327
  setImageModels([]);
201
328
  setSelectedImageModelId("");
329
+ setImageModelsError(describeServiceError(result, "Could not load image models"));
202
330
  return;
203
331
  }
204
332
  const models = result.data.models ?? [];
333
+ if (models.length === 0) {
334
+ setImageModelsError("No image models are available to your account");
335
+ }
205
336
  const defaultModelId = result.data.defaultModelId ||
206
337
  models.find((model) => model.isDefault)?.id ||
207
338
  models[0]?.id ||
@@ -218,6 +349,9 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
218
349
  console.error("[AiImageEditorDialog] Failed to load models:", err);
219
350
  setImageModels([]);
220
351
  setSelectedImageModelId("");
352
+ setImageModelsError(err instanceof Error && err.message
353
+ ? `Could not load image models: ${err.message}`
354
+ : "Could not load image models");
221
355
  }
222
356
  }
223
357
  finally {
@@ -230,7 +364,7 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
230
364
  return () => {
231
365
  cancelled = true;
232
366
  };
233
- }, [open]);
367
+ }, [open, imageModelsReloadKey]);
234
368
  useEffect(() => {
235
369
  if (selectedImageModelId &&
236
370
  imageModels.some((model) => model.id === selectedImageModelId)) {
@@ -308,7 +442,7 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
308
442
  }, [editContext, handleFileUpload]);
309
443
  // Search media library with generated description
310
444
  const handleSearchMedia = useCallback(async () => {
311
- if (!editContext?.selectMedia || !generatePrompt.trim())
445
+ if (!editContext?.selectMedia || !prompt.trim())
312
446
  return;
313
447
  setBrowsingMedia(true);
314
448
  setError(null);
@@ -317,7 +451,7 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
317
451
  const mediaId = await editContext.selectMedia({
318
452
  selectedIdPath: "",
319
453
  mode: "images",
320
- initialSearchTerm: generatePrompt.trim(),
454
+ initialSearchTerm: prompt.trim(),
321
455
  });
322
456
  if (!mediaId) {
323
457
  setBrowsingMedia(false);
@@ -350,7 +484,7 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
350
484
  finally {
351
485
  setBrowsingMedia(false);
352
486
  }
353
- }, [editContext, handleFileUpload, generatePrompt]);
487
+ }, [editContext, handleFileUpload, prompt]);
354
488
  // Delete an uploaded image
355
489
  const handleDeleteImage = useCallback(async (imageId) => {
356
490
  setImages((prev) => {
@@ -385,20 +519,39 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
385
519
  handleFileUpload(files);
386
520
  }
387
521
  }, [handleFileUpload]);
388
- // Drag and drop handlers
522
+ // Drag and drop: the whole dialog is the drop target. dragenter/dragleave
523
+ // fire for every child the pointer crosses, so a depth counter tells a
524
+ // real leave from a hop between children.
525
+ const dragDepthRef = useRef(0);
526
+ const isFileDrag = (e) => Array.from(e.dataTransfer?.types ?? []).includes("Files");
527
+ const handleDragEnter = useCallback((e) => {
528
+ if (!isFileDrag(e))
529
+ return;
530
+ e.preventDefault();
531
+ e.stopPropagation();
532
+ dragDepthRef.current += 1;
533
+ setIsDragOver(true);
534
+ }, []);
389
535
  const handleDragOver = useCallback((e) => {
536
+ if (!isFileDrag(e))
537
+ return;
390
538
  e.preventDefault();
391
539
  e.stopPropagation();
392
540
  setIsDragOver(true);
393
541
  }, []);
394
542
  const handleDragLeave = useCallback((e) => {
543
+ if (!isFileDrag(e))
544
+ return;
395
545
  e.preventDefault();
396
546
  e.stopPropagation();
397
- setIsDragOver(false);
547
+ dragDepthRef.current = Math.max(0, dragDepthRef.current - 1);
548
+ if (dragDepthRef.current === 0)
549
+ setIsDragOver(false);
398
550
  }, []);
399
551
  const handleDrop = useCallback((e) => {
400
552
  e.preventDefault();
401
553
  e.stopPropagation();
554
+ dragDepthRef.current = 0;
402
555
  setIsDragOver(false);
403
556
  if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {
404
557
  // Filter to only image files
@@ -424,8 +577,8 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
424
577
  }, []);
425
578
  // Submit the prompt to start the backend image job (no agent)
426
579
  const handleSubmit = useCallback(async () => {
427
- const isModifyMode = images.length > 0;
428
- const activePrompt = isModifyMode ? modifyPrompt : generatePrompt;
580
+ const withSourceImages = images.length > 0;
581
+ const activePrompt = prompt;
429
582
  if (!activePrompt.trim())
430
583
  return;
431
584
  if (!fieldDescriptor) {
@@ -443,7 +596,7 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
443
596
  setSubmitting(true);
444
597
  setError(null);
445
598
  try {
446
- const sourceImages = isModifyMode
599
+ const sourceImages = withSourceImages
447
600
  ? await Promise.all(images.map(async (img) => {
448
601
  if (!img.file)
449
602
  throw new Error(`Missing image file: ${img.fileName}`);
@@ -463,10 +616,11 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
463
616
  variantName,
464
617
  pageItemId: editContext.page?.item?.id,
465
618
  targetFolderId,
619
+ aspectRatio: aspectRatio || undefined,
466
620
  sourceImages,
467
621
  }, editContext.sessionId);
468
622
  if (response.type !== "success") {
469
- setError(response.summary || "Failed to start image job");
623
+ setError(describeServiceError(response, "Failed to start image job"));
470
624
  setSubmitting(false);
471
625
  return;
472
626
  }
@@ -480,8 +634,7 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
480
634
  }
481
635
  }, [
482
636
  images,
483
- modifyPrompt,
484
- generatePrompt,
637
+ prompt,
485
638
  fieldDescriptor,
486
639
  variantName,
487
640
  editContext,
@@ -490,6 +643,7 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
490
643
  onClose,
491
644
  targetFolderId,
492
645
  selectedImageModelId,
646
+ aspectRatio,
493
647
  ]);
494
648
  // Handle suggesting a description based on context
495
649
  const handleSuggestDescription = useCallback(async () => {
@@ -530,11 +684,11 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
530
684
  addSocketMessageListener: editContext.addSocketMessageListener,
531
685
  timeout: 60000,
532
686
  onContentUpdate: (content) => {
533
- setGeneratePrompt(extractSuggestionFromFence(content));
687
+ setPrompt(extractSuggestionFromFence(content));
534
688
  },
535
689
  });
536
690
  if (result.success) {
537
- setGeneratePrompt(extractSuggestionFromFence(result.content));
691
+ setPrompt(extractSuggestionFromFence(result.content));
538
692
  }
539
693
  else {
540
694
  setError(result.error || "Failed to get suggestion");
@@ -567,7 +721,7 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
567
721
  try {
568
722
  const result = await executeCreateItem({ id: parentId, language: targetFolderLanguage, version: 0 }, MEDIA_FOLDER_TEMPLATE_ID, name, editContext?.sessionId);
569
723
  if (result.type !== "success" || !result.data?.id) {
570
- setNewFolderError(result.summary || "Failed to create folder");
724
+ setNewFolderError(describeServiceError(result, "Failed to create folder"));
571
725
  return;
572
726
  }
573
727
  const createdId = result.data.id;
@@ -654,6 +808,13 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
654
808
  useEffect(() => {
655
809
  if (!open) {
656
810
  initialImageLoadedRef.current = false;
811
+ aspectRatioManuallySetRef.current = false;
812
+ dragDepthRef.current = 0;
813
+ setIsDragOver(false);
814
+ setInitialImageSettled(false);
815
+ setAspectRatioPopoverOpen(false);
816
+ setAddImagePopoverOpen(false);
817
+ setAspectRatio(lockedAspectRatioOption?.value ?? DEFAULT_ASPECT_RATIO);
657
818
  targetFolderManuallySelectedRef.current = false;
658
819
  setTargetFolderInitialized(false);
659
820
  setTargetFolderIsPersonal(false);
@@ -873,129 +1034,213 @@ export const AiImageEditorDialog = forwardRef(({ open, onClose, onComplete, fiel
873
1034
  }
874
1035
  finally {
875
1036
  setUploading(false);
1037
+ setInitialImageSettled(true);
876
1038
  }
877
1039
  };
878
1040
  loadCurrentImage();
879
1041
  }, [open, currentImageSrc, currentMediaItemId, handleFileUpload]);
880
- // Preset prompts for common operations
881
- const presetPrompts = [
882
- {
883
- label: "Enhance",
884
- prompt: "Enhance this image to improve quality and clarity",
885
- },
886
- {
887
- label: "Remove Background",
888
- prompt: "Remove the background from this image",
889
- },
890
- { label: "Upscale", prompt: "Upscale this image to higher resolution" },
891
- {
892
- label: "Fix Lighting",
893
- prompt: "Improve the lighting and color balance of this image",
894
- },
1042
+ // Starters for edit mode. Each one is an opening the user completes, so
1043
+ // the chips teach how to phrase an edit instead of promising operations
1044
+ // (background removal, upscaling) that a re-rendering pipeline with JPEG
1045
+ // output cannot deliver.
1046
+ const editStarters = [
1047
+ { label: "Change background", prompt: "Change the background to " },
1048
+ { label: "Change lighting", prompt: "Change the lighting to " },
1049
+ { label: "Remove something", prompt: "Remove the " },
1050
+ { label: "Change style", prompt: "Render this image in the style of " },
895
1051
  ];
896
- const canSubmit = (images.length > 0 ? modifyPrompt.trim() : generatePrompt.trim()) &&
897
- !!targetFolderId &&
898
- !submitting &&
899
- !uploading;
1052
+ const applyStarter = (starter) => {
1053
+ setPrompt(starter.prompt);
1054
+ const textarea = promptRef.current;
1055
+ if (!textarea)
1056
+ return;
1057
+ requestAnimationFrame(() => {
1058
+ textarea.focus({ preventScroll: true });
1059
+ const end = textarea.value.length;
1060
+ textarea.setSelectionRange(end, end);
1061
+ });
1062
+ };
1063
+ const expectsSourceImage = !!(currentImageSrc || currentMediaItemId);
1064
+ // A dialog opened on an existing image is an edit from the first frame,
1065
+ // so the title does not flip once the image has been fetched.
1066
+ const isModifyMode = images.length > 0 || (expectsSourceImage && !initialImageSettled);
1067
+ const hasPrompt = prompt.trim().length > 0;
1068
+ const canSubmit = hasPrompt && !!targetFolderId && !submitting && !uploading;
1069
+ const submitShortcutLabel = getSubmitShortcutLabel();
1070
+ const submitLabel = isModifyMode ? "Edit image" : "Generate image";
1071
+ const submitHint = !targetFolderInitialized
1072
+ ? "Loading the target folder..."
1073
+ : !targetFolderId
1074
+ ? "Choose a folder to save the image first"
1075
+ : uploading
1076
+ ? "Loading the current image..."
1077
+ : !hasPrompt
1078
+ ? isModifyMode
1079
+ ? "Describe the change first"
1080
+ : "Describe the image first"
1081
+ : `${submitLabel} · ${submitShortcutLabel}`;
1082
+ const canBrowseMedia = !!editContext?.selectMedia;
1083
+ const selectedAspectRatioOption = ASPECT_RATIO_OPTIONS.find((option) => option.value === aspectRatio) ??
1084
+ ASPECT_RATIO_OPTIONS[0];
1085
+ const aspectRatioFromVariant = !!lockedAspectRatioOption &&
1086
+ lockedAspectRatioOption.value === aspectRatio;
1087
+ // Ctrl/Cmd+Enter submits from the prompt, like the other AI dialogs
1088
+ const handlePromptKeyDown = (e) => {
1089
+ if (e.key !== "Enter" || !(e.ctrlKey || e.metaKey))
1090
+ return;
1091
+ if (e.nativeEvent.isComposing)
1092
+ return;
1093
+ e.preventDefault();
1094
+ e.stopPropagation();
1095
+ if (canSubmit)
1096
+ void handleSubmit();
1097
+ };
1098
+ const toolbarButtonClassName = "text-neutral-grey-50 hover:text-neutral-grey-100 hover:bg-neutral-grey-5 h-7 gap-1.5 px-2";
1099
+ const popoverRowClassName = (isSelected) => cn("flex w-full cursor-pointer items-center gap-2 rounded-[4px] px-2 py-1.5 text-left text-xs transition-colors focus-visible:outline-none", isSelected
1100
+ ? "bg-neutral-grey-5 text-neutral-grey-100 hover:bg-neutral-grey-10 focus-visible:bg-neutral-grey-10"
1101
+ : "text-neutral-grey-50 hover:bg-neutral-grey-5 hover:text-neutral-grey-100 focus-visible:bg-neutral-grey-5 focus-visible:text-neutral-grey-100");
900
1102
  const renderImageModelPopover = () => {
901
- if (!showImageModelSelector)
902
- return null;
903
- const tooltipLabel = selectedImageModelOption
1103
+ if (!showImageModelSelector) {
1104
+ if (!imageModelsError)
1105
+ return null;
1106
+ const reason = imageModelsError.replace(/\.+$/, "");
1107
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "ghost", size: "xs", className: cn(toolbarButtonClassName, "text-feedback-red hover:text-feedback-red max-w-[220px]"), disabled: submitting, "aria-label": `${reason}. Retry`, onClick: () => setImageModelsReloadKey((key) => key + 1), "data-testid": "ai-image-models-error", children: [_jsx(AlertCircle, { className: "h-3.5 w-3.5", strokeWidth: 1 }), _jsx("span", { className: "truncate", children: "No image models" })] }) }), _jsxs(TooltipContent, { side: "top", sideOffset: 6, children: [reason, ". Click to retry."] })] }));
1108
+ }
1109
+ const ariaLabel = selectedImageModelOption
904
1110
  ? `Image model: ${selectedImageModelOption.label}`
905
1111
  : "Choose image model";
1112
+ const tooltipLabel = selectedImageModelOption
1113
+ ? `Image model: ${selectedImageModelOption.rawName}`
1114
+ : "Choose image model";
906
1115
  const visibleLabel = imageModelsLoading
907
1116
  ? "Loading model..."
908
1117
  : selectedImageModelOption?.label || "Choose image model";
909
- return (_jsxs(Popover, { open: imageModelPopoverOpen, onOpenChange: setImageModelPopoverOpen, enableIframeClickDetection: false, children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "ghost", size: "xs", className: "text-neutral-grey-50 hover:text-neutral-grey-100 h-7 max-w-[220px] gap-1.5 px-2 hover:bg-white", disabled: submitting, "aria-label": tooltipLabel, "data-testid": "ai-image-model-selector", children: [imageModelsLoading ? (_jsx(Loader2, { strokeWidth: 1, className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(Cpu, { className: "h-3.5 w-3.5", strokeWidth: 1 })), _jsx("span", { className: "truncate", title: visibleLabel, children: visibleLabel }), _jsx(ChevronDown, { className: `h-3.5 w-3.5 transition-transform ${imageModelPopoverOpen ? "rotate-180" : ""}`, strokeWidth: 1, "aria-hidden": "true", "data-testid": "ai-image-model-selector-chevron" })] }) }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: tooltipLabel })] }), _jsxs(PopoverContent, { className: "w-64 p-1.5", align: "end", side: "top", sideOffset: 8, children: [_jsx("div", { className: "text-neutral-grey-50 px-2 py-1 text-[10px] font-medium tracking-wider", children: "Image model" }), imageModelsLoading ? (_jsxs("div", { className: "text-neutral-grey-50 flex items-center gap-2 px-2 py-2 text-xs", children: [_jsx(Loader2, { strokeWidth: 1, className: "h-3.5 w-3.5 animate-spin" }), "Loading models..."] })) : (_jsx("div", { className: "space-y-0.5", children: imageModelOptions.map((option) => {
1118
+ return (_jsxs(Popover, { open: imageModelPopoverOpen, onOpenChange: setImageModelPopoverOpen, enableIframeClickDetection: false, children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "ghost", size: "xs", className: cn(toolbarButtonClassName, "max-w-[220px]"), disabled: submitting, "aria-label": ariaLabel, "data-testid": "ai-image-model-selector", children: [imageModelsLoading ? (_jsx(Loader2, { strokeWidth: 1, className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(Cpu, { className: "h-3.5 w-3.5", strokeWidth: 1 })), _jsx("span", { className: "truncate", children: visibleLabel }), _jsx(ChevronDown, { className: `h-3.5 w-3.5 transition-transform ${imageModelPopoverOpen ? "rotate-180" : ""}`, strokeWidth: 1, "aria-hidden": "true", "data-testid": "ai-image-model-selector-chevron" })] }) }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: tooltipLabel })] }), _jsxs(PopoverContent, { className: "w-64 p-1.5", align: "start", side: "bottom", sideOffset: 6, children: [_jsx("div", { className: "text-neutral-grey-50 px-2 py-1 text-[10px] font-medium tracking-wider", children: "Image model" }), imageModelsLoading ? (_jsxs("div", { className: "text-neutral-grey-50 flex items-center gap-2 px-2 py-2 text-xs", children: [_jsx(Loader2, { strokeWidth: 1, className: "h-3.5 w-3.5 animate-spin" }), "Loading models..."] })) : (_jsx("div", { className: "space-y-0.5", children: imageModelOptions.map((option) => {
910
1119
  const isSelected = selectedImageModelId === option.value;
911
- return (_jsxs("button", { type: "button", onClick: () => {
1120
+ return (_jsxs("button", { type: "button", title: option.rawName, onClick: () => {
912
1121
  setSelectedImageModelId(option.value);
913
1122
  setImageModelPopoverOpen(false);
914
- }, className: `flex w-full cursor-pointer items-start gap-2 rounded-[4px] px-2 py-1.5 text-left text-xs transition-colors focus-visible:outline-none ${isSelected
915
- ? "bg-neutral-grey-5 text-neutral-grey-100 hover:bg-neutral-grey-10 focus-visible:bg-neutral-grey-10"
916
- : "text-neutral-grey-50 hover:bg-neutral-grey-5 hover:text-neutral-grey-100 focus-visible:bg-neutral-grey-5 focus-visible:text-neutral-grey-100"}`, children: [_jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate font-medium", children: option.label }), option.description && (_jsx("span", { className: "text-neutral-grey-50 mt-0.5 block truncate text-[10px]", children: option.description }))] }), _jsx(Check, { className: `mt-0.5 h-3.5 w-3.5 shrink-0 ${isSelected ? "opacity-100" : "opacity-0"}`, strokeWidth: 1 })] }, option.value));
1123
+ }, className: cn(popoverRowClassName(isSelected), "items-start"), children: [_jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate font-medium", children: option.label }), option.description && (_jsx("span", { className: "text-neutral-grey-50 mt-0.5 block truncate text-[10px]", children: option.description }))] }), _jsx(Check, { className: `mt-0.5 h-3.5 w-3.5 shrink-0 ${isSelected ? "opacity-100" : "opacity-0"}`, strokeWidth: 1 })] }, option.value));
917
1124
  }) }))] })] }));
918
1125
  };
919
- return (_jsx(Dialog, { open: open, onOpenChange: (isOpen) => !isOpen && handleCancel(), children: _jsxs(DialogContent, { className: "flex max-w-2xl flex-col overflow-hidden border-none p-0 shadow-2xl", style: { height: "auto", maxHeight: "90vh" }, onPaste: handlePaste, children: [_jsx(StyledDialogTitle, { icon: _jsx(Sparkles, { strokeWidth: 1 }), title: "AI image editor", subtitle: "Describe what you want to create, or upload images to modify" }), _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto overscroll-y-contain px-6 pb-4", children: _jsxs("div", { className: "flex flex-col gap-4 pt-6", children: [error && (_jsx("div", { className: "border-feedback-red bg-feedback-red-light text-feedback-red rounded border p-3 text-sm", children: error })), images.length === 0 && (_jsxs("div", { className: "bg-neutral-grey-5 relative space-y-3 rounded-xl p-4", children: [fieldDescriptor && (_jsxs(Button, { variant: "ghost", size: "sm", className: "text-highlight-100 hover:bg-highlight-10 hover:text-highlight-100 absolute top-4 right-4 z-10 h-7 gap-1.5 px-2 text-xs", onClick: (e) => {
1126
+ const renderAspectRatioGlyph = (ratio) => {
1127
+ const width = ratio >= 1 ? 14 : Math.round(14 * ratio);
1128
+ const height = ratio >= 1 ? Math.round(14 / ratio) : 14;
1129
+ return (_jsx("span", { "aria-hidden": "true", className: "flex h-3.5 w-3.5 shrink-0 items-center justify-center", children: _jsx("span", { className: "rounded-[2px] border border-current", style: { width, height } }) }));
1130
+ };
1131
+ const renderAspectRatioPopover = () => {
1132
+ const variantLabel = variantName
1133
+ ? `the ${variantName} variant`
1134
+ : "the picture variant";
1135
+ const tooltipLabel = aspectRatioFromVariant
1136
+ ? `Aspect ratio ${aspectRatio} (${selectedAspectRatioOption.description}), from ${variantLabel}`
1137
+ : `Aspect ratio ${aspectRatio} (${selectedAspectRatioOption.description})`;
1138
+ return (_jsxs(Popover, { open: aspectRatioPopoverOpen, onOpenChange: setAspectRatioPopoverOpen, enableIframeClickDetection: false, children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "ghost", size: "xs", className: toolbarButtonClassName, disabled: submitting, "aria-label": `Aspect ratio: ${aspectRatio}`, "data-testid": "ai-image-aspect-ratio", children: [renderAspectRatioGlyph(selectedAspectRatioOption.ratio), _jsx("span", { children: aspectRatio }), _jsx(ChevronDown, { className: `h-3.5 w-3.5 transition-transform ${aspectRatioPopoverOpen ? "rotate-180" : ""}`, strokeWidth: 1, "aria-hidden": "true" })] }) }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: tooltipLabel })] }), _jsxs(PopoverContent, { className: "w-56 p-1.5", align: "start", side: "bottom", sideOffset: 6, children: [_jsx("div", { className: "text-neutral-grey-50 px-2 py-1 text-[10px] font-medium tracking-wider", children: "Aspect ratio" }), _jsx("div", { className: "space-y-0.5", children: ASPECT_RATIO_OPTIONS.map((option) => {
1139
+ const isSelected = option.value === aspectRatio;
1140
+ const isVariantRatio = lockedAspectRatioOption?.value === option.value;
1141
+ return (_jsxs("button", { type: "button", onClick: () => {
1142
+ aspectRatioManuallySetRef.current = true;
1143
+ setAspectRatio(option.value);
1144
+ setAspectRatioPopoverOpen(false);
1145
+ }, className: popoverRowClassName(isSelected), "data-testid": `ai-image-aspect-ratio-${option.value.replace(":", "x")}`, children: [renderAspectRatioGlyph(option.ratio), _jsx("span", { className: "w-9 shrink-0 font-medium", children: option.value }), _jsxs("span", { className: "text-neutral-grey-50 min-w-0 flex-1 truncate text-[10px]", children: [option.description, isVariantRatio ? " · variant" : ""] }), _jsx(Check, { className: `h-3.5 w-3.5 shrink-0 ${isSelected ? "opacity-100" : "opacity-0"}`, strokeWidth: 1 })] }, option.value));
1146
+ }) })] })] }));
1147
+ };
1148
+ const renderAddImageMenu = () => {
1149
+ const busy = uploading || browsingMedia;
1150
+ const triggerContent = (_jsxs(_Fragment, { children: [busy ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", strokeWidth: 1 })) : (_jsx(ImagePlus, { className: "h-3.5 w-3.5", strokeWidth: 1 })), "Add reference image"] }));
1151
+ if (!canBrowseMedia) {
1152
+ return (_jsx(Button, { type: "button", variant: "ghost", size: "xs", className: toolbarButtonClassName, onClick: () => fileInputRef.current?.click(), disabled: submitting || busy, "data-testid": "ai-image-add-reference", children: triggerContent }));
1153
+ }
1154
+ return (_jsxs(Popover, { open: addImagePopoverOpen, onOpenChange: setAddImagePopoverOpen, enableIframeClickDetection: false, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "xs", className: toolbarButtonClassName, disabled: submitting || busy, "data-testid": "ai-image-add-reference", children: triggerContent }) }), _jsxs(PopoverContent, { className: "w-60 p-1.5", align: "start", side: "bottom", sideOffset: 6, children: [_jsxs("div", { className: "space-y-0.5", children: [_jsxs("button", { type: "button", onClick: () => {
1155
+ setAddImagePopoverOpen(false);
1156
+ fileInputRef.current?.click();
1157
+ }, className: popoverRowClassName(false), "data-testid": "ai-image-upload", children: [_jsx(Upload, { className: "h-3.5 w-3.5 shrink-0", strokeWidth: 1 }), "Upload from computer"] }), _jsxs("button", { type: "button", onClick: () => {
1158
+ setAddImagePopoverOpen(false);
1159
+ void handleBrowseMedia();
1160
+ }, className: popoverRowClassName(false), "data-testid": "ai-image-browse-media", children: [_jsx(FolderOpen, { className: "h-3.5 w-3.5 shrink-0", strokeWidth: 1 }), "Browse media library"] })] }), _jsx("div", { className: "text-neutral-grey-50 px-2 pt-1.5 pb-1 text-[10px]", children: "You can also paste or drop images anywhere in this dialog." })] })] }));
1161
+ };
1162
+ const renderTargetFolderPicker = () => (_jsxs(Popover, { open: targetFolderPickerOpen, onOpenChange: handleTargetFolderPickerOpenChange, enableIframeClickDetection: false, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx("button", { type: "button", className: "text-highlight-100 hover:text-highlight-100-hover shrink-0 font-medium underline-offset-2 transition-colors hover:underline disabled:cursor-default disabled:opacity-50 disabled:hover:no-underline", disabled: !targetFolderInitialized || submitting, "aria-busy": !targetFolderInitialized, "data-testid": "ai-image-target-folder-trigger", children: targetFolderId ? "Change" : "Choose folder" }) }), _jsxs(PopoverContent, { ref: targetFolderPickerContentRef, className: "pointer-events-auto z-[110] w-[min(520px,calc(100vw-2rem))] p-2", align: "start", side: "top", sideOffset: 8, "aria-label": "Select folder", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between gap-2 pl-2", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx("div", { className: "bg-highlight-10 text-highlight-100 flex h-7 w-7 shrink-0 items-center justify-center rounded-lg", children: _jsx(FolderOpen, { className: "h-4 w-4", strokeWidth: 1 }) }), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "text-neutral-grey-100 text-xs font-medium", children: "Select folder" }), _jsx("span", { className: "text-neutral-grey-50 text-2xs truncate", title: folderPickerSelection?.path, children: folderPickerSelection
1163
+ ? `Highlighted: ${formatFolderPath(folderPickerSelection.path)}`
1164
+ : "Pick a media folder for the generated image" })] })] }), _jsx(CloseButton, { label: "Close folder picker", showTooltip: false, onClick: () => handleTargetFolderPickerOpenChange(false), "data-testid": "ai-image-target-folder-close" })] }), _jsx("div", { className: "border-border-default h-[360px] overflow-auto overscroll-contain rounded-lg border bg-white p-1", children: _jsx(ContentTree, { rootItemIds: folderPickerRootItemIds, selectionMode: "single", selectedItemIds: folderPickerSelectedItemIds, templateIds: folderPickerTemplateIds, hideRootNodes: true, expandIdPath: folderPickerSelection?.idPath ??
1165
+ targetFolderExpandIdPath ??
1166
+ "3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1", onSelectionChange: (selection) => {
1167
+ const node = selection[0];
1168
+ if (!node?.id)
1169
+ return;
1170
+ setFolderPickerSelection({
1171
+ id: node.id,
1172
+ name: node.displayName || node.name || "",
1173
+ path: node.path || "",
1174
+ idPath: node.idPath,
1175
+ canCreate: node.canCreate !== false,
1176
+ });
1177
+ }, renderNode: (node, defaultRenderer) => node.data?.canCreate ===
1178
+ false ? (_jsx("span", { className: "opacity-50", title: "You cannot save images into this folder", children: defaultRenderer(node) })) : (defaultRenderer(node)), language: targetFolderLanguage, includeItemPath: true, database: "master" }) }), _jsx("div", { className: "border-border-default mt-2 border-t pt-2", children: creatingFolder ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { autoFocus: true, value: newFolderName, onChange: (e) => setNewFolderName(e.target.value), onKeyDown: (e) => {
1179
+ if (e.key === "Enter") {
1180
+ e.preventDefault();
1181
+ handleCreateFolder();
1182
+ }
1183
+ else if (e.key === "Escape") {
1184
+ e.stopPropagation();
1185
+ setCreatingFolder(false);
1186
+ setNewFolderName("");
1187
+ setNewFolderError(null);
1188
+ }
1189
+ }, placeholder: "Folder name", className: "h-8 flex-1 text-xs", disabled: newFolderSubmitting, "data-testid": "ai-image-new-folder-name" }), _jsxs(Button, { size: "sm", onClick: handleCreateFolder, disabled: !newFolderName.trim() || newFolderSubmitting, "data-testid": "ai-image-new-folder-create", children: [newFolderSubmitting ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", strokeWidth: 1 })) : null, "Create"] }), _jsx(Button, { size: "sm", variant: "ghost", onClick: () => {
1190
+ setCreatingFolder(false);
1191
+ setNewFolderName("");
1192
+ setNewFolderError(null);
1193
+ }, disabled: newFolderSubmitting, children: "Cancel" })] }), newFolderError && (_jsx("div", { className: "text-feedback-red mt-1 text-xs", children: newFolderError }))] })) : (_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs(Button, { variant: "ghost", size: "sm", className: "min-w-0 gap-1.5", onClick: () => {
1194
+ setCreatingFolder(true);
1195
+ setNewFolderError(null);
1196
+ }, disabled: !folderPickerCanCreate, "data-testid": "ai-image-new-folder", children: [_jsx(FolderPlus, { className: "h-3.5 w-3.5 shrink-0", strokeWidth: 1 }), _jsx("span", { className: "shrink-0", children: "New folder" }), _jsxs("span", { className: "text-neutral-grey-50 truncate font-normal", children: ["in", " ", folderPickerSelection
1197
+ ? folderPickerSelection.name ||
1198
+ folderPickerSelection.path.split("/").pop() ||
1199
+ "selected folder"
1200
+ : "Media Library"] })] }) }), _jsx(TooltipContent, { side: "bottom", sideOffset: 6, children: folderPickerCanCreate
1201
+ ? folderPickerSelection
1202
+ ? "Create a subfolder inside the highlighted folder"
1203
+ : "Create a folder at the Media Library root"
1204
+ : folderPickerSelection
1205
+ ? "You cannot create folders in the highlighted folder"
1206
+ : "You cannot create folders at the Media Library root. Select a folder first." })] }), _jsx(Button, { size: "sm", className: "shrink-0", onClick: handleSelectTargetFolder, disabled: !folderPickerSelection?.canCreate, "data-testid": "ai-image-target-folder-select", children: "Select folder" })] })) })] })] }));
1207
+ return (_jsx(Dialog, { open: open, onOpenChange: (isOpen) => !isOpen && handleCancel(), children: _jsxs(DialogContent, { className: "flex max-w-2xl flex-col overflow-hidden border-none p-0 shadow-2xl", style: { height: "auto", maxHeight: "90vh" }, onPaste: handlePaste, onDragEnter: handleDragEnter, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onOpenAutoFocus: (e) => {
1208
+ const textarea = promptRef.current;
1209
+ if (!textarea)
1210
+ return;
1211
+ e.preventDefault();
1212
+ textarea.focus({ preventScroll: true });
1213
+ const end = textarea.value.length;
1214
+ textarea.setSelectionRange(end, end);
1215
+ }, children: [_jsx(StyledDialogTitle, { icon: _jsx(Sparkles, { strokeWidth: 1 }), title: isModifyMode ? "Edit image" : "Generate image" }), isDragOver && (_jsx("div", { className: "border-highlight-100 bg-highlight-10/90 text-highlight-100 pointer-events-none absolute inset-0 z-20 flex items-center justify-center rounded-[inherit] border-2 border-dashed text-sm font-medium", "data-testid": "ai-image-drop-overlay", children: "Drop images to add them as references" })), _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto overscroll-y-contain px-6 py-5", children: _jsxs("div", { className: "flex flex-col gap-3", children: [error && (_jsx("div", { className: "border-feedback-red bg-feedback-red-light text-feedback-red rounded-lg border p-3 text-sm", children: error })), _jsxs("div", { className: cn("border-border-default relative min-w-0 rounded-[12px] border bg-white transition-colors duration-200", isDragOver && "border-highlight-100"), "data-testid": "ai-image-composer", children: [_jsx(Textarea, { ref: promptRef, value: prompt, onChange: (e) => setPrompt(e.target.value), onKeyDown: handlePromptKeyDown, placeholder: isModifyMode
1216
+ ? "E.g., Remove the background, change the lighting, add a person on the left..."
1217
+ : "Describe the image you want to create...", "aria-label": isModifyMode
1218
+ ? "Describe how to change the images"
1219
+ : "Describe the image to create", className: "max-h-60 min-h-[96px] w-full resize-none overflow-y-auto rounded-none border-0 bg-transparent px-4 pt-3.5 pb-2 text-sm shadow-none focus-visible:border-0 focus-visible:shadow-none focus-visible:ring-0", disabled: submitting, "data-testid": "ai-image-prompt", "data-mode": isModifyMode ? "modify" : "generate" }), images.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2 px-4 pb-2", "data-testid": "ai-image-reference-strip", children: images.map((img) => (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "border-border-default bg-neutral-grey-5 relative h-16 w-16 overflow-hidden rounded-lg border", children: [img.loading ? (_jsx("div", { className: "flex h-full w-full items-center justify-center", children: _jsx(Loader2, { className: "text-neutral-grey-50 h-5 w-5 animate-spin", strokeWidth: 1 }) })) : img.thumbnailUrl ? (_jsx("img", { src: img.thumbnailUrl, alt: img.fileName, className: "h-full w-full object-cover" })) : (_jsx("div", { className: "flex h-full w-full items-center justify-center", children: _jsx(ImageIcon, { className: "text-neutral-grey-50 h-6 w-6", strokeWidth: 1 }) })), _jsx("button", { type: "button", onClick: () => handleDeleteImage(img.id), className: "bg-neutral-grey-100/70 hover:bg-neutral-grey-100 absolute top-1 right-1 flex h-5 w-5 items-center justify-center rounded-full text-white transition-colors disabled:opacity-50", title: "Remove image", "aria-label": `Remove ${img.fileName}`, disabled: submitting, children: _jsx(X, { className: "h-3 w-3", strokeWidth: 1.5 }) })] }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, className: "max-w-xs break-words", children: img.fileName })] }, img.id))) })), _jsxs("div", { className: "flex flex-wrap items-center gap-1 px-2 pt-1 pb-2", children: [renderImageModelPopover(), renderAspectRatioPopover(), renderAddImageMenu(), _jsx("div", { className: "ml-auto flex items-center gap-1", children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "inline-flex", children: _jsx("button", { type: "button", onClick: () => void handleSubmit(), disabled: !canSubmit, "aria-label": submitLabel, "aria-keyshortcuts": "Control+Enter Meta+Enter", "data-testid": "ai-image-submit", className: cn("flex h-7 w-7 items-center justify-center rounded-[6px] transition-colors duration-200", canSubmit
1220
+ ? "bg-neutral-grey-100 hover:bg-neutral-grey-100/90 text-white"
1221
+ : "bg-neutral-grey-5 text-neutral-grey-50 cursor-not-allowed"), children: submitting ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", strokeWidth: 1 })) : (_jsx(ArrowUp, { className: "h-4 w-4", strokeWidth: 1 })) }) }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: submitHint })] }) })] })] }), isModifyMode ? (_jsx("div", { className: "flex flex-wrap items-center gap-1.5", "data-testid": "ai-image-edit-starters", children: editStarters.map((starter) => (_jsx("button", { type: "button", onClick: (e) => {
1222
+ e.stopPropagation();
1223
+ applyStarter(starter);
1224
+ }, className: "border-border-default text-neutral-grey-50 hover:border-highlight-100 hover:text-highlight-100 text-2xs rounded-full border bg-white px-2.5 py-0.5 transition-colors disabled:opacity-50", disabled: submitting, children: starter.label }, starter.label))) })) : ((fieldDescriptor || canBrowseMedia) && (_jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1", children: [fieldDescriptor && (_jsxs("button", { type: "button", onClick: (e) => {
920
1225
  e.stopPropagation();
921
1226
  handleSuggestDescription();
922
- }, disabled: suggesting || submitting, children: [suggesting ? (_jsx(Loader2, { strokeWidth: 1, className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(Lightbulb, { strokeWidth: 1, className: "h-3.5 w-3.5" })), suggesting ? "Suggesting..." : "Suggest"] })), _jsx(Textarea, { value: generatePrompt, onChange: (e) => setGeneratePrompt(e.target.value), placeholder: "Describe the image you want to create...", className: `resize-none border-none bg-transparent p-0 shadow-none focus-visible:!shadow-none focus-visible:ring-0 ${fieldDescriptor ? "min-h-[104px] pr-24" : "min-h-[64px]"}`, disabled: submitting }), showImageModelSelector && (_jsx("div", { className: "flex justify-end", children: renderImageModelPopover() }))] })), _jsxs("div", { ref: dropZoneRef, onDragOver: handleDragOver, onDragEnter: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, className: `relative rounded-lg border-2 border-dashed p-4 transition-colors ${isDragOver
923
- ? "border-highlight-100 bg-highlight-10"
924
- : "border-border-default bg-white"}`, children: [images.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-neutral-grey-100 mb-[18px] text-sm", children: isDragOver
925
- ? "Drop images here"
926
- : "Modify these images or add more:" }), _jsxs("div", { className: "mb-4 flex flex-wrap gap-3", children: [images.map((img) => (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { tabIndex: 0, className: "group border-border-default relative h-20 w-20 overflow-hidden rounded-lg border bg-white", children: [img.loading ? (_jsx("div", { className: "flex h-full w-full items-center justify-center", children: _jsx(Loader2, { className: "text-neutral-grey-50 h-6 w-6 animate-spin", strokeWidth: 1 }) })) : img.thumbnailUrl ? (_jsx("img", { src: img.thumbnailUrl, alt: img.fileName, className: "h-full w-full object-cover" })) : (_jsx("div", { className: "flex h-full w-full items-center justify-center", children: _jsx(ImageIcon, { className: "text-neutral-grey-50 h-8 w-8", strokeWidth: 1 }) })), _jsx("button", { onClick: () => handleDeleteImage(img.id), className: "bg-neutral-grey-100/50 absolute top-1 right-1 rounded-full p-1 opacity-0 transition-opacity group-hover:opacity-100", title: "Remove image", children: _jsx(X, { className: "h-3 w-3 text-white", strokeWidth: 1 }) })] }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, className: "max-w-xs break-words", children: img.fileName })] }, img.id))), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => fileInputRef.current?.click(), className: "border-border-default text-neutral-grey-50 hover:border-highlight-100 hover:text-highlight-100 hover:bg-highlight-10 flex h-20 w-20 items-center justify-center rounded-lg border border-dashed bg-white transition-colors disabled:cursor-not-allowed disabled:opacity-50", disabled: uploading || submitting, "aria-label": "Upload image", children: uploading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin", strokeWidth: 1 })) : (_jsx(Plus, { className: "h-5 w-5", strokeWidth: 1 })) }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: "Upload image" })] })] })] })), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx("div", { className: "text-neutral-grey-50 text-sm", children: images.length === 0
927
- ? isDragOver
928
- ? "Drop images here"
929
- : "Or, drag & drop images here to modify:"
930
- : "" }), _jsxs("div", { className: "flex gap-2", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: () => fileInputRef.current?.click(), disabled: uploading, children: [uploading ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", strokeWidth: 1 })) : (_jsx(Upload, { className: "h-3.5 w-3.5", strokeWidth: 1 })), "Upload image"] }), editContext?.selectMedia && (_jsxs(_Fragment, { children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: handleBrowseMedia, disabled: browsingMedia, children: [_jsx(FolderOpen, { className: "h-3.5 w-3.5", strokeWidth: 1 }), "Browse media library"] }), images.length === 0 && generatePrompt.trim() && (_jsxs(Button, { variant: "outline", size: "sm", onClick: handleSearchMedia, disabled: browsingMedia, children: [_jsx(Search, { className: "h-3.5 w-3.5", strokeWidth: 1 }), "Search"] }))] }))] }), _jsx("input", { ref: fileInputRef, type: "file", className: "hidden", accept: "image/*", multiple: true, onChange: (e) => {
931
- const files = e.target.files
932
- ? Array.from(e.target.files)
933
- : null;
934
- e.target.value = "";
935
- handleFileUpload(files);
936
- } })] })] }), images.length > 0 && (_jsxs("div", { className: "bg-neutral-grey-5 space-y-3 rounded-xl p-4", children: [_jsx("div", { className: "flex items-center justify-between", children: _jsx("div", { className: "flex items-center gap-2", children: _jsx("span", { className: "text-neutral-grey-100 text-sm font-medium", children: "Enhance & Modify" }) }) }), _jsx(Textarea, { value: modifyPrompt, onChange: (e) => setModifyPrompt(e.target.value), placeholder: "E.g., Remove the background, improve lighting, upscale...", className: "min-h-[64px] resize-none border-none bg-transparent p-0 shadow-none focus-visible:!shadow-none focus-visible:ring-0", disabled: submitting }), _jsxs("div", { className: "mt-2 flex items-center gap-2", children: [_jsx("div", { className: "flex flex-1 flex-wrap gap-1", children: presetPrompts.map((preset) => (_jsx("button", { onClick: (e) => {
937
- e.stopPropagation();
938
- setModifyPrompt(preset.prompt);
939
- }, className: `text-2xs rounded-full border px-2 py-0.5 transition-colors ${modifyPrompt === preset.prompt
940
- ? "border-highlight-100 bg-highlight-100 text-white"
941
- : "border-border-default text-neutral-grey-50 hover:border-highlight-100 hover:text-highlight-100 bg-white"}`, disabled: submitting, children: preset.label }, preset.label))) }), renderImageModelPopover()] })] })), _jsxs("div", { className: cn("rounded-xl border bg-white p-4 transition-colors", targetFolderId
942
- ? "border-border-default"
943
- : "border-feedback-orange/30"), "data-testid": "ai-image-target-folder-card", children: [_jsx("div", { className: "text-neutral-grey-50 text-2xs mb-2", children: "Save generated image to" }), _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [_jsx("div", { className: cn("flex h-9 w-9 shrink-0 items-center justify-center rounded-lg", targetFolderId
944
- ? "bg-highlight-10 text-highlight-100"
945
- : "bg-feedback-orange-light text-feedback-orange"), children: _jsx(FolderOpen, { className: "h-4.5 w-4.5", strokeWidth: 1 }) }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx("span", { className: "text-neutral-grey-100 truncate text-sm font-medium", "data-testid": "ai-image-target-folder-name", children: targetFolderInitialized
946
- ? targetFolderName ||
947
- (targetFolderId ? "Selected folder" : "No folder selected")
948
- : "Loading folder..." }), targetFolderIsPersonal && targetFolderId && (_jsx("span", { className: "bg-highlight-10 text-highlight-100 text-2xs shrink-0 rounded-full px-2 py-0.5 font-medium", "data-testid": "ai-image-target-folder-personal-badge", children: "Your media folder" }))] }), targetFolderPath ? (_jsx("div", { className: "text-neutral-grey-50 truncate text-xs", title: targetFolderPath, children: formatFolderPath(targetFolderPath) })) : (_jsx("div", { className: "text-neutral-grey-50 text-xs", children: "Choose where the generated image is saved" }))] })] }), _jsxs(Popover, { open: targetFolderPickerOpen, onOpenChange: handleTargetFolderPickerOpenChange, enableIframeClickDetection: false, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", size: "sm", className: "shrink-0", disabled: !targetFolderInitialized, "aria-busy": !targetFolderInitialized, "data-testid": "ai-image-target-folder-trigger", children: [!targetFolderInitialized ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", strokeWidth: 1 })) : null, !targetFolderInitialized
949
- ? "Loading"
950
- : targetFolderId
951
- ? "Change folder"
952
- : "Select"] }) }), _jsxs(PopoverContent, { ref: targetFolderPickerContentRef, className: "pointer-events-auto z-[110] w-[520px] p-2", align: "end", "aria-label": "Select folder", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between gap-2 pl-2", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx("div", { className: "bg-highlight-10 text-highlight-100 flex h-7 w-7 shrink-0 items-center justify-center rounded-lg", children: _jsx(FolderOpen, { className: "h-4 w-4", strokeWidth: 1 }) }), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "text-neutral-grey-100 text-xs font-medium", children: "Select folder" }), _jsx("span", { className: "text-neutral-grey-50 text-2xs truncate", title: folderPickerSelection?.path, children: folderPickerSelection
953
- ? `Highlighted: ${formatFolderPath(folderPickerSelection.path)}`
954
- : "Pick a media folder for the generated image" })] })] }), _jsx(CloseButton, { label: "Close folder picker", showTooltip: false, onClick: () => handleTargetFolderPickerOpenChange(false), "data-testid": "ai-image-target-folder-close" })] }), _jsx("div", { className: "border-border-default h-[360px] overflow-auto overscroll-contain rounded-lg border bg-white p-1", children: _jsx(ContentTree, { rootItemIds: folderPickerRootItemIds, selectionMode: "single", selectedItemIds: folderPickerSelectedItemIds, templateIds: folderPickerTemplateIds, hideRootNodes: true, expandIdPath: folderPickerSelection?.idPath ??
955
- targetFolderExpandIdPath ??
956
- "3D6658D8-A0BF-4E75-B3E2-D050FABCF4E1", onSelectionChange: (selection) => {
957
- const node = selection[0];
958
- if (!node?.id)
959
- return;
960
- setFolderPickerSelection({
961
- id: node.id,
962
- name: node.displayName || node.name || "",
963
- path: node.path || "",
964
- idPath: node.idPath,
965
- canCreate: node.canCreate !== false,
966
- });
967
- }, renderNode: (node, defaultRenderer) => node.data
968
- ?.canCreate === false ? (_jsx("span", { className: "opacity-50", title: "You cannot save images into this folder", children: defaultRenderer(node) })) : (defaultRenderer(node)), language: targetFolderLanguage, includeItemPath: true, database: "master" }) }), _jsx("div", { className: "border-border-default mt-2 border-t pt-2", children: creatingFolder ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { autoFocus: true, value: newFolderName, onChange: (e) => setNewFolderName(e.target.value), onKeyDown: (e) => {
969
- if (e.key === "Enter") {
970
- e.preventDefault();
971
- handleCreateFolder();
972
- }
973
- else if (e.key === "Escape") {
974
- e.stopPropagation();
975
- setCreatingFolder(false);
976
- setNewFolderName("");
977
- setNewFolderError(null);
978
- }
979
- }, placeholder: "Folder name", className: "h-8 flex-1 text-xs", disabled: newFolderSubmitting, "data-testid": "ai-image-new-folder-name" }), _jsxs(Button, { size: "sm", onClick: handleCreateFolder, disabled: !newFolderName.trim() || newFolderSubmitting, "data-testid": "ai-image-new-folder-create", children: [newFolderSubmitting ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", strokeWidth: 1 })) : null, "Create"] }), _jsx(Button, { size: "sm", variant: "ghost", onClick: () => {
980
- setCreatingFolder(false);
981
- setNewFolderName("");
982
- setNewFolderError(null);
983
- }, disabled: newFolderSubmitting, children: "Cancel" })] }), newFolderError && (_jsx("div", { className: "text-feedback-red mt-1 text-xs", children: newFolderError }))] })) : (_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs(Button, { variant: "ghost", size: "sm", className: "min-w-0 gap-1.5", onClick: () => {
984
- setCreatingFolder(true);
985
- setNewFolderError(null);
986
- }, disabled: !folderPickerCanCreate, "data-testid": "ai-image-new-folder", children: [_jsx(FolderPlus, { className: "h-3.5 w-3.5 shrink-0", strokeWidth: 1 }), _jsx("span", { className: "shrink-0", children: "New folder" }), _jsxs("span", { className: "text-neutral-grey-50 truncate font-normal", children: ["in", " ", folderPickerSelection
987
- ? folderPickerSelection.name ||
988
- folderPickerSelection.path
989
- .split("/")
990
- .pop() ||
991
- "selected folder"
992
- : "Media Library"] })] }) }), _jsx(TooltipContent, { side: "bottom", sideOffset: 6, children: folderPickerCanCreate
993
- ? folderPickerSelection
994
- ? "Create a subfolder inside the highlighted folder"
995
- : "Create a folder at the Media Library root"
996
- : folderPickerSelection
997
- ? "You cannot create folders in the highlighted folder"
998
- : "You cannot create folders at the Media Library root. Select a folder first." })] }), _jsx(Button, { size: "sm", className: "shrink-0", onClick: handleSelectTargetFolder, disabled: !folderPickerSelection?.canCreate, "data-testid": "ai-image-target-folder-select", children: "Select folder" })] })) })] })] })] }), targetFolderInitialized && !targetFolderId && (_jsx("div", { className: "bg-feedback-orange-light text-feedback-orange mt-3 rounded-lg px-3 py-2 text-xs", children: "Select a target folder to enable generation." }))] })] }) }), _jsxs(DialogButtons, { className: "bg-white", children: [_jsx(Button, { variant: "outline", onClick: handleCancel, disabled: submitting, children: "Cancel" }), _jsx(Button, { onClick: handleSubmit, disabled: !canSubmit, className: "min-w-[100px] gap-1", children: submitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin", strokeWidth: 1 }), "Generating..."] })) : (_jsx(_Fragment, { children: "Generate Image" })) })] })] }) }));
1227
+ }, disabled: suggesting || submitting, className: "text-highlight-100 hover:text-highlight-100-hover inline-flex items-center gap-1.5 text-xs transition-colors disabled:cursor-not-allowed disabled:opacity-60", "data-testid": "ai-image-describe", children: [suggesting ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", strokeWidth: 1 })) : (_jsx(Lightbulb, { className: "h-3.5 w-3.5", strokeWidth: 1 })), suggesting
1228
+ ? "Describing..."
1229
+ : "Describe from page context"] })), canBrowseMedia && (_jsxs("button", { type: "button", onClick: handleSearchMedia, disabled: browsingMedia || !hasPrompt, className: "text-neutral-grey-50 hover:text-highlight-100 disabled:hover:text-neutral-grey-50 inline-flex items-center gap-1.5 text-xs transition-colors disabled:cursor-not-allowed disabled:opacity-60", title: hasPrompt
1230
+ ? "Find media library images matching the description"
1231
+ : "Describe the image first to search the media library", "data-testid": "ai-image-search-media", children: [_jsx(Search, { className: "h-3.5 w-3.5", strokeWidth: 1 }), browsingMedia
1232
+ ? "Opening the media library..."
1233
+ : "Search the media library for this description"] }))] }))), _jsx("input", { ref: fileInputRef, type: "file", className: "hidden", accept: "image/*", multiple: true, onChange: (e) => {
1234
+ const files = e.target.files
1235
+ ? Array.from(e.target.files)
1236
+ : null;
1237
+ e.target.value = "";
1238
+ handleFileUpload(files);
1239
+ } })] }) }), _jsxs("div", { className: "border-border-default flex flex-wrap items-center justify-between gap-x-4 gap-y-2 border-t bg-white px-6 py-3", "data-testid": "ai-image-target-folder-card", children: [_jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2 text-xs", children: [_jsx(FolderOpen, { className: cn("h-4 w-4 shrink-0", targetFolderId
1240
+ ? "text-neutral-grey-50"
1241
+ : "text-feedback-orange"), strokeWidth: 1 }), targetFolderId ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-neutral-grey-50 shrink-0", children: "Saving to" }), _jsx("span", { className: "text-neutral-grey-100 truncate font-medium", title: targetFolderPath, "data-testid": "ai-image-target-folder-name", children: formatFolderPath(targetFolderPath) ||
1242
+ targetFolderName ||
1243
+ "Selected folder" }), targetFolderIsPersonal && (_jsx("span", { className: "bg-highlight-10 text-highlight-100 text-2xs shrink-0 rounded-full px-2 py-0.5 font-medium", "data-testid": "ai-image-target-folder-personal-badge", children: "Your folder" }))] })) : !targetFolderInitialized ? (_jsx("span", { className: "text-neutral-grey-50", children: "Loading folder..." })) : (_jsx("span", { className: "text-feedback-orange", "data-testid": "ai-image-target-folder-name", children: "No folder selected" })), renderTargetFolderPicker()] }), _jsx(Button, { variant: "outline", size: "sm", onClick: handleCancel, disabled: submitting, children: "Cancel" })] })] }) }));
999
1244
  });
1000
1245
  AiImageEditorDialog.displayName = "AiImageEditorDialog";
1001
1246
  export default AiImageEditorDialog;