@parhelia/core 0.3.12832 → 0.3.12833

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 (472) 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/editor/agent-changes/agentChangeTargets.js +6 -0
  23. package/dist/editor/agent-changes/agentChangeTargets.js.map +1 -1
  24. package/dist/editor/agent-changes/agentChangeTextHighlight.d.ts +48 -4
  25. package/dist/editor/agent-changes/agentChangeTextHighlight.js +67 -9
  26. package/dist/editor/agent-changes/agentChangeTextHighlight.js.map +1 -1
  27. package/dist/editor/ai/AgentImagePreview.d.ts +13 -0
  28. package/dist/editor/ai/AgentImagePreview.js +41 -0
  29. package/dist/editor/ai/AgentImagePreview.js.map +1 -0
  30. package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js +1 -1
  31. package/dist/editor/ai/terminal/components/CreateItemToolCallContent.js.map +1 -1
  32. package/dist/editor/ai/terminal/components/ResponseTurnDuration.js +1 -2
  33. package/dist/editor/ai/terminal/components/ResponseTurnDuration.js.map +1 -1
  34. package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.d.ts +6 -0
  35. package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.js +61 -0
  36. package/dist/editor/ai/terminal/components/ToolCallDiagnosticsPanel.js.map +1 -0
  37. package/dist/editor/ai/terminal/toolCallDiagnostics.d.ts +34 -0
  38. package/dist/editor/ai/terminal/toolCallDiagnostics.js +218 -0
  39. package/dist/editor/ai/terminal/toolCallDiagnostics.js.map +1 -0
  40. package/dist/editor/bridge/linkDownload.d.ts +3 -0
  41. package/dist/editor/bridge/linkDownload.js +52 -0
  42. package/dist/editor/bridge/linkDownload.js.map +1 -0
  43. package/dist/editor/client/clipboardStorage.d.ts +10 -0
  44. package/dist/editor/client/clipboardStorage.js +57 -0
  45. package/dist/editor/client/clipboardStorage.js.map +1 -0
  46. package/dist/editor/client/hooks/useRepositoryItemRefresh.d.ts +4 -0
  47. package/dist/editor/client/hooks/useRepositoryItemRefresh.js +62 -0
  48. package/dist/editor/client/hooks/useRepositoryItemRefresh.js.map +1 -0
  49. package/dist/editor/client/liveEditState.d.ts +16 -0
  50. package/dist/editor/client/liveEditState.js +25 -0
  51. package/dist/editor/client/liveEditState.js.map +1 -0
  52. package/dist/editor/client/liveSessionState.d.ts +6 -0
  53. package/dist/editor/client/liveSessionState.js +20 -0
  54. package/dist/editor/client/liveSessionState.js.map +1 -0
  55. package/dist/editor/client/valueStore.d.ts +22 -0
  56. package/dist/editor/client/valueStore.js +29 -0
  57. package/dist/editor/client/valueStore.js.map +1 -0
  58. package/dist/editor/commands/componentClipboardCommands.d.ts +35 -0
  59. package/dist/editor/commands/componentClipboardCommands.js +271 -0
  60. package/dist/editor/commands/componentClipboardCommands.js.map +1 -0
  61. package/dist/editor/commands/componentMenuGroups.d.ts +2 -0
  62. package/dist/editor/commands/componentMenuGroups.js +43 -0
  63. package/dist/editor/commands/componentMenuGroups.js.map +1 -0
  64. package/dist/editor/component-conversion/ComponentTypePickerDialog.d.ts +12 -0
  65. package/dist/editor/component-conversion/ComponentTypePickerDialog.js +40 -0
  66. package/dist/editor/component-conversion/ComponentTypePickerDialog.js.map +1 -0
  67. package/dist/editor/component-conversion/ConversionAiDebugButton.d.ts +17 -0
  68. package/dist/editor/component-conversion/ConversionAiDebugButton.js +80 -0
  69. package/dist/editor/component-conversion/ConversionAiDebugButton.js.map +1 -0
  70. package/dist/editor/component-conversion/ConvertComponentDialog.d.ts +28 -0
  71. package/dist/editor/component-conversion/ConvertComponentDialog.js +633 -0
  72. package/dist/editor/component-conversion/ConvertComponentDialog.js.map +1 -0
  73. package/dist/editor/component-conversion/conversionModel.d.ts +109 -0
  74. package/dist/editor/component-conversion/conversionModel.js +519 -0
  75. package/dist/editor/component-conversion/conversionModel.js.map +1 -0
  76. package/dist/editor/component-conversion/conversionService.d.ts +12 -0
  77. package/dist/editor/component-conversion/conversionService.js +16 -0
  78. package/dist/editor/component-conversion/conversionService.js.map +1 -0
  79. package/dist/editor/component-conversion/conversionTypes.d.ts +214 -0
  80. package/dist/editor/component-conversion/conversionTypes.js +2 -0
  81. package/dist/editor/component-conversion/conversionTypes.js.map +1 -0
  82. package/dist/editor/component-conversion/convertComponentsCommand.d.ts +25 -0
  83. package/dist/editor/component-conversion/convertComponentsCommand.js +196 -0
  84. package/dist/editor/component-conversion/convertComponentsCommand.js.map +1 -0
  85. package/dist/editor/field-types/FieldHistoryBoundary.js +28 -7
  86. package/dist/editor/field-types/FieldHistoryBoundary.js.map +1 -1
  87. package/dist/editor/field-types/fieldStyles.d.ts +21 -0
  88. package/dist/editor/field-types/fieldStyles.js +22 -0
  89. package/dist/editor/field-types/fieldStyles.js.map +1 -0
  90. package/dist/editor/field-types/richtext/utils/changeHighlight.d.ts +14 -0
  91. package/dist/editor/field-types/richtext/utils/changeHighlight.js +12 -1
  92. package/dist/editor/field-types/richtext/utils/changeHighlight.js.map +1 -1
  93. package/dist/editor/field-types/richtext/utils/spellCheckText.d.ts +31 -0
  94. package/dist/editor/field-types/richtext/utils/spellCheckText.js +82 -0
  95. package/dist/editor/field-types/richtext/utils/spellCheckText.js.map +1 -0
  96. package/dist/editor/field-types/useFocusedFieldInput.d.ts +13 -0
  97. package/dist/editor/field-types/useFocusedFieldInput.js +50 -0
  98. package/dist/editor/field-types/useFocusedFieldInput.js.map +1 -0
  99. package/dist/editor/field-types/useFormFieldSelectionRange.d.ts +43 -0
  100. package/dist/editor/field-types/useFormFieldSelectionRange.js +149 -0
  101. package/dist/editor/field-types/useFormFieldSelectionRange.js.map +1 -0
  102. package/dist/editor/find-replace/FindReplacePanel.d.ts +11 -0
  103. package/dist/editor/find-replace/FindReplacePanel.js +311 -0
  104. package/dist/editor/find-replace/FindReplacePanel.js.map +1 -0
  105. package/dist/editor/find-replace/findReplaceCommand.d.ts +8 -0
  106. package/dist/editor/find-replace/findReplaceCommand.js +25 -0
  107. package/dist/editor/find-replace/findReplaceCommand.js.map +1 -0
  108. package/dist/editor/find-replace/findReplaceMatches.d.ts +42 -0
  109. package/dist/editor/find-replace/findReplaceMatches.js +66 -0
  110. package/dist/editor/find-replace/findReplaceMatches.js.map +1 -0
  111. package/dist/editor/find-replace/findReplaceStore.d.ts +30 -0
  112. package/dist/editor/find-replace/findReplaceStore.js +61 -0
  113. package/dist/editor/find-replace/findReplaceStore.js.map +1 -0
  114. package/dist/editor/find-replace/findReplaceTargets.d.ts +51 -0
  115. package/dist/editor/find-replace/findReplaceTargets.js +110 -0
  116. package/dist/editor/find-replace/findReplaceTargets.js.map +1 -0
  117. package/dist/editor/find-replace/findReplaceText.d.ts +50 -0
  118. package/dist/editor/find-replace/findReplaceText.js +189 -0
  119. package/dist/editor/find-replace/findReplaceText.js.map +1 -0
  120. package/dist/editor/itemContextMenuGroups.js +10 -1
  121. package/dist/editor/itemContextMenuGroups.js.map +1 -1
  122. package/dist/editor/media-selector/MediaDetailsView.d.ts +14 -0
  123. package/dist/editor/media-selector/MediaDetailsView.js +152 -0
  124. package/dist/editor/media-selector/MediaDetailsView.js.map +1 -0
  125. package/dist/editor/media-selector/useMediaFolderDrag.d.ts +26 -0
  126. package/dist/editor/media-selector/useMediaFolderDrag.js +153 -0
  127. package/dist/editor/media-selector/useMediaFolderDrag.js.map +1 -0
  128. package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.d.ts +11 -0
  129. package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.js +65 -0
  130. package/dist/editor/menubar/toolbar-sections/CommentsToggleControl.js.map +1 -0
  131. package/dist/editor/menubar/toolbar-sections/FindReplaceControls.d.ts +6 -0
  132. package/dist/editor/menubar/toolbar-sections/FindReplaceControls.js +31 -0
  133. package/dist/editor/menubar/toolbar-sections/FindReplaceControls.js.map +1 -0
  134. package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.d.ts +5 -0
  135. package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.js +16 -0
  136. package/dist/editor/menubar/toolbar-sections/SpellCheckToggleControl.js.map +1 -0
  137. package/dist/editor/mobileBottomPanel.d.ts +40 -0
  138. package/dist/editor/mobileBottomPanel.js +63 -0
  139. package/dist/editor/mobileBottomPanel.js.map +1 -0
  140. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.d.ts +3 -6
  141. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js +8 -6
  142. package/dist/editor/page-editor-chrome/AgentChangeHighlightings.js.map +1 -1
  143. package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.d.ts +6 -0
  144. package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.js +100 -0
  145. package/dist/editor/page-editor-chrome/BridgePasteCleanupOverlay.js.map +1 -0
  146. package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.d.ts +9 -0
  147. package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.js +32 -0
  148. package/dist/editor/page-editor-chrome/CanvasOverviewRulerBinding.js.map +1 -0
  149. package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.d.ts +14 -0
  150. package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.js +110 -0
  151. package/dist/editor/page-editor-chrome/CommentTargetPickerCanvasLayer.js.map +1 -0
  152. package/dist/editor/page-editor-chrome/ConversionIndicators.d.ts +8 -0
  153. package/dist/editor/page-editor-chrome/ConversionIndicators.js +75 -0
  154. package/dist/editor/page-editor-chrome/ConversionIndicators.js.map +1 -0
  155. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.d.ts +9 -13
  156. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js +25 -20
  157. package/dist/editor/page-editor-chrome/DiffHighlightOverlay.js.map +1 -1
  158. package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.d.ts +15 -0
  159. package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.js +31 -0
  160. package/dist/editor/page-editor-chrome/FeedbackLeaderCanvasSegment.js.map +1 -0
  161. package/dist/editor/page-editor-chrome/FindReplaceHighlightings.d.ts +11 -0
  162. package/dist/editor/page-editor-chrome/FindReplaceHighlightings.js +120 -0
  163. package/dist/editor/page-editor-chrome/FindReplaceHighlightings.js.map +1 -0
  164. package/dist/editor/page-editor-chrome/SpellCheckHighlightings.d.ts +12 -0
  165. package/dist/editor/page-editor-chrome/SpellCheckHighlightings.js +197 -0
  166. package/dist/editor/page-editor-chrome/SpellCheckHighlightings.js.map +1 -0
  167. package/dist/editor/page-editor-chrome/ValidationRulerMarks.d.ts +11 -0
  168. package/dist/editor/page-editor-chrome/ValidationRulerMarks.js +56 -0
  169. package/dist/editor/page-editor-chrome/ValidationRulerMarks.js.map +1 -0
  170. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.d.ts +44 -0
  171. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.js +89 -0
  172. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorMeasurements.js.map +1 -0
  173. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.d.ts +17 -0
  174. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.js +53 -0
  175. package/dist/editor/page-editor-chrome/overlay/feedbackAnchorStore.js.map +1 -0
  176. package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.d.ts +11 -0
  177. package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.js +84 -0
  178. package/dist/editor/page-editor-chrome/overlay/useBridgeTextRangeRequest.js.map +1 -0
  179. package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.d.ts +34 -0
  180. package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.js +229 -0
  181. package/dist/editor/page-editor-chrome/overlay/useCommentAnchorMeasurements.js.map +1 -0
  182. package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.d.ts +9 -0
  183. package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.js +34 -0
  184. package/dist/editor/page-editor-chrome/overlay/useOverlayViewportRight.js.map +1 -0
  185. package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.d.ts +49 -0
  186. package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.js +241 -0
  187. package/dist/editor/page-editor-chrome/overlay/useSuggestionAnchorMeasurements.js.map +1 -0
  188. package/dist/editor/page-viewer/CanvasOverviewRuler.d.ts +11 -0
  189. package/dist/editor/page-viewer/CanvasOverviewRuler.js +65 -0
  190. package/dist/editor/page-viewer/CanvasOverviewRuler.js.map +1 -0
  191. package/dist/editor/page-viewer/DynamicRenderingsBar.d.ts +23 -0
  192. package/dist/editor/page-viewer/DynamicRenderingsBar.js +28 -0
  193. package/dist/editor/page-viewer/DynamicRenderingsBar.js.map +1 -0
  194. package/dist/editor/page-viewer/DynamicRenderingsStrip.d.ts +18 -0
  195. package/dist/editor/page-viewer/DynamicRenderingsStrip.js +29 -0
  196. package/dist/editor/page-viewer/DynamicRenderingsStrip.js.map +1 -0
  197. package/dist/editor/page-viewer/FeedbackMargin.d.ts +57 -0
  198. package/dist/editor/page-viewer/FeedbackMargin.js +377 -0
  199. package/dist/editor/page-viewer/FeedbackMargin.js.map +1 -0
  200. package/dist/editor/page-viewer/FeedbackMarginController.d.ts +76 -0
  201. package/dist/editor/page-viewer/FeedbackMarginController.js +241 -0
  202. package/dist/editor/page-viewer/FeedbackMarginController.js.map +1 -0
  203. package/dist/editor/page-viewer/FeedbackMarginMarker.d.ts +16 -0
  204. package/dist/editor/page-viewer/FeedbackMarginMarker.js +24 -0
  205. package/dist/editor/page-viewer/FeedbackMarginMarker.js.map +1 -0
  206. package/dist/editor/page-viewer/FeedbackMarginResizeHandle.d.ts +23 -0
  207. package/dist/editor/page-viewer/FeedbackMarginResizeHandle.js +105 -0
  208. package/dist/editor/page-viewer/FeedbackMarginResizeHandle.js.map +1 -0
  209. package/dist/editor/page-viewer/InteractivePreviewBar.d.ts +24 -0
  210. package/dist/editor/page-viewer/InteractivePreviewBar.js +31 -0
  211. package/dist/editor/page-viewer/InteractivePreviewBar.js.map +1 -0
  212. package/dist/editor/page-viewer/MobileCommentsPanel.d.ts +16 -0
  213. package/dist/editor/page-viewer/MobileCommentsPanel.js +112 -0
  214. package/dist/editor/page-viewer/MobileCommentsPanel.js.map +1 -0
  215. package/dist/editor/page-viewer/RenderingAiCheck.d.ts +18 -0
  216. package/dist/editor/page-viewer/RenderingAiCheck.js +45 -0
  217. package/dist/editor/page-viewer/RenderingAiCheck.js.map +1 -0
  218. package/dist/editor/page-viewer/RenderingApprovalDialog.d.ts +32 -0
  219. package/dist/editor/page-viewer/RenderingApprovalDialog.js +191 -0
  220. package/dist/editor/page-viewer/RenderingApprovalDialog.js.map +1 -0
  221. package/dist/editor/page-viewer/SealedClientCodePreview.d.ts +17 -0
  222. package/dist/editor/page-viewer/SealedClientCodePreview.js +38 -0
  223. package/dist/editor/page-viewer/SealedClientCodePreview.js.map +1 -0
  224. package/dist/editor/page-viewer/canvasFrameNavigation.d.ts +18 -0
  225. package/dist/editor/page-viewer/canvasFrameNavigation.js +36 -0
  226. package/dist/editor/page-viewer/canvasFrameNavigation.js.map +1 -0
  227. package/dist/editor/page-viewer/canvasLoadSettling.d.ts +42 -0
  228. package/dist/editor/page-viewer/canvasLoadSettling.js +46 -0
  229. package/dist/editor/page-viewer/canvasLoadSettling.js.map +1 -0
  230. package/dist/editor/page-viewer/canvasScrollHandoff.d.ts +34 -0
  231. package/dist/editor/page-viewer/canvasScrollHandoff.js +55 -0
  232. package/dist/editor/page-viewer/canvasScrollHandoff.js.map +1 -0
  233. package/dist/editor/page-viewer/compareFrameWidth.d.ts +8 -0
  234. package/dist/editor/page-viewer/compareFrameWidth.js +25 -0
  235. package/dist/editor/page-viewer/compareFrameWidth.js.map +1 -0
  236. package/dist/editor/page-viewer/feedbackMarginLayout.d.ts +119 -0
  237. package/dist/editor/page-viewer/feedbackMarginLayout.js +155 -0
  238. package/dist/editor/page-viewer/feedbackMarginLayout.js.map +1 -0
  239. package/dist/editor/page-viewer/feedbackMarginSources.d.ts +36 -0
  240. package/dist/editor/page-viewer/feedbackMarginSources.js +196 -0
  241. package/dist/editor/page-viewer/feedbackMarginSources.js.map +1 -0
  242. package/dist/editor/page-viewer/feedbackMarginWidth.d.ts +43 -0
  243. package/dist/editor/page-viewer/feedbackMarginWidth.js +107 -0
  244. package/dist/editor/page-viewer/feedbackMarginWidth.js.map +1 -0
  245. package/dist/editor/page-viewer/interactivePreview.d.ts +168 -0
  246. package/dist/editor/page-viewer/interactivePreview.js +344 -0
  247. package/dist/editor/page-viewer/interactivePreview.js.map +1 -0
  248. package/dist/editor/page-viewer/minimapViewport.d.ts +2 -0
  249. package/dist/editor/page-viewer/minimapViewport.js +34 -0
  250. package/dist/editor/page-viewer/minimapViewport.js.map +1 -0
  251. package/dist/editor/page-viewer/openPageItems.d.ts +29 -0
  252. package/dist/editor/page-viewer/openPageItems.js +73 -0
  253. package/dist/editor/page-viewer/openPageItems.js.map +1 -0
  254. package/dist/editor/page-viewer/overviewRuler.d.ts +128 -0
  255. package/dist/editor/page-viewer/overviewRuler.js +226 -0
  256. package/dist/editor/page-viewer/overviewRuler.js.map +1 -0
  257. package/dist/editor/page-viewer/renderingApproval.d.ts +59 -0
  258. package/dist/editor/page-viewer/renderingApproval.js +186 -0
  259. package/dist/editor/page-viewer/renderingApproval.js.map +1 -0
  260. package/dist/editor/page-viewer/renderingChanges.d.ts +29 -0
  261. package/dist/editor/page-viewer/renderingChanges.js +40 -0
  262. package/dist/editor/page-viewer/renderingChanges.js.map +1 -0
  263. package/dist/editor/page-viewer/scrollIntoViewTextRanges.d.ts +23 -0
  264. package/dist/editor/page-viewer/scrollIntoViewTextRanges.js +26 -0
  265. package/dist/editor/page-viewer/scrollIntoViewTextRanges.js.map +1 -0
  266. package/dist/editor/page-viewer/useInteractivePreview.d.ts +77 -0
  267. package/dist/editor/page-viewer/useInteractivePreview.js +210 -0
  268. package/dist/editor/page-viewer/useInteractivePreview.js.map +1 -0
  269. package/dist/editor/reviews/CollapsibleText.d.ts +13 -0
  270. package/dist/editor/reviews/CollapsibleText.js +41 -0
  271. package/dist/editor/reviews/CollapsibleText.js.map +1 -0
  272. package/dist/editor/reviews/CommentImageAttachments.d.ts +12 -0
  273. package/dist/editor/reviews/CommentImageAttachments.js +19 -0
  274. package/dist/editor/reviews/CommentImageAttachments.js.map +1 -0
  275. package/dist/editor/reviews/CommentQuote.d.ts +13 -0
  276. package/dist/editor/reviews/CommentQuote.js +35 -0
  277. package/dist/editor/reviews/CommentQuote.js.map +1 -0
  278. package/dist/editor/reviews/CommentTargetOutline.d.ts +13 -0
  279. package/dist/editor/reviews/CommentTargetOutline.js +21 -0
  280. package/dist/editor/reviews/CommentTargetOutline.js.map +1 -0
  281. package/dist/editor/reviews/CommentTargetPickerDomLayer.d.ts +7 -0
  282. package/dist/editor/reviews/CommentTargetPickerDomLayer.js +117 -0
  283. package/dist/editor/reviews/CommentTargetPickerDomLayer.js.map +1 -0
  284. package/dist/editor/reviews/CommentThreadAgentLink.d.ts +28 -0
  285. package/dist/editor/reviews/CommentThreadAgentLink.js +37 -0
  286. package/dist/editor/reviews/CommentThreadAgentLink.js.map +1 -0
  287. package/dist/editor/reviews/CommentThreadCard.d.ts +34 -0
  288. package/dist/editor/reviews/CommentThreadCard.js +156 -0
  289. package/dist/editor/reviews/CommentThreadCard.js.map +1 -0
  290. package/dist/editor/reviews/SuggestionThreadCard.d.ts +19 -0
  291. package/dist/editor/reviews/SuggestionThreadCard.js +25 -0
  292. package/dist/editor/reviews/SuggestionThreadCard.js.map +1 -0
  293. package/dist/editor/reviews/addCommentOnTarget.d.ts +22 -0
  294. package/dist/editor/reviews/addCommentOnTarget.js +32 -0
  295. package/dist/editor/reviews/addCommentOnTarget.js.map +1 -0
  296. package/dist/editor/reviews/balloonLayout.d.ts +51 -0
  297. package/dist/editor/reviews/balloonLayout.js +101 -0
  298. package/dist/editor/reviews/balloonLayout.js.map +1 -0
  299. package/dist/editor/reviews/commentAgentAttachments.d.ts +5 -0
  300. package/dist/editor/reviews/commentAgentAttachments.js +51 -0
  301. package/dist/editor/reviews/commentAgentAttachments.js.map +1 -0
  302. package/dist/editor/reviews/commentImages.d.ts +48 -0
  303. package/dist/editor/reviews/commentImages.js +128 -0
  304. package/dist/editor/reviews/commentImages.js.map +1 -0
  305. package/dist/editor/reviews/commentTargetPicker.d.ts +114 -0
  306. package/dist/editor/reviews/commentTargetPicker.js +153 -0
  307. package/dist/editor/reviews/commentTargetPicker.js.map +1 -0
  308. package/dist/editor/reviews/feedbackBalloonDate.d.ts +8 -0
  309. package/dist/editor/reviews/feedbackBalloonDate.js +22 -0
  310. package/dist/editor/reviews/feedbackBalloonDate.js.map +1 -0
  311. package/dist/editor/reviews/feedbackDrafts.d.ts +49 -0
  312. package/dist/editor/reviews/feedbackDrafts.js +74 -0
  313. package/dist/editor/reviews/feedbackDrafts.js.map +1 -0
  314. package/dist/editor/reviews/feedbackHoverState.d.ts +18 -0
  315. package/dist/editor/reviews/feedbackHoverState.js +35 -0
  316. package/dist/editor/reviews/feedbackHoverState.js.map +1 -0
  317. package/dist/editor/reviews/feedbackPersonFilter.d.ts +3 -0
  318. package/dist/editor/reviews/feedbackPersonFilter.js +32 -0
  319. package/dist/editor/reviews/feedbackPersonFilter.js.map +1 -0
  320. package/dist/editor/reviews/feedbackThreadSelection.d.ts +10 -0
  321. package/dist/editor/reviews/feedbackThreadSelection.js +31 -0
  322. package/dist/editor/reviews/feedbackThreadSelection.js.map +1 -0
  323. package/dist/editor/reviews/feedbackThreads.d.ts +50 -0
  324. package/dist/editor/reviews/feedbackThreads.js +135 -0
  325. package/dist/editor/reviews/feedbackThreads.js.map +1 -0
  326. package/dist/editor/reviews/feedbackWheelForwarding.d.ts +34 -0
  327. package/dist/editor/reviews/feedbackWheelForwarding.js +108 -0
  328. package/dist/editor/reviews/feedbackWheelForwarding.js.map +1 -0
  329. package/dist/editor/reviews/reviewUrlScope.d.ts +23 -0
  330. package/dist/editor/reviews/reviewUrlScope.js +86 -0
  331. package/dist/editor/reviews/reviewUrlScope.js.map +1 -0
  332. package/dist/editor/reviews/scrollWithin.d.ts +29 -0
  333. package/dist/editor/reviews/scrollWithin.js +87 -0
  334. package/dist/editor/reviews/scrollWithin.js.map +1 -0
  335. package/dist/editor/reviews/subtreeFeedback.d.ts +57 -0
  336. package/dist/editor/reviews/subtreeFeedback.js +137 -0
  337. package/dist/editor/reviews/subtreeFeedback.js.map +1 -0
  338. package/dist/editor/reviews/useCommentImagePaste.d.ts +80 -0
  339. package/dist/editor/reviews/useCommentImagePaste.js +252 -0
  340. package/dist/editor/reviews/useCommentImagePaste.js.map +1 -0
  341. package/dist/editor/reviews/useFeedbackThreads.d.ts +35 -0
  342. package/dist/editor/reviews/useFeedbackThreads.js +137 -0
  343. package/dist/editor/reviews/useFeedbackThreads.js.map +1 -0
  344. package/dist/editor/reviews/useMeasuredHeights.d.ts +25 -0
  345. package/dist/editor/reviews/useMeasuredHeights.js +176 -0
  346. package/dist/editor/reviews/useMeasuredHeights.js.map +1 -0
  347. package/dist/editor/reviews/usePendingFeedbackFocus.d.ts +7 -0
  348. package/dist/editor/reviews/usePendingFeedbackFocus.js +42 -0
  349. package/dist/editor/reviews/usePendingFeedbackFocus.js.map +1 -0
  350. package/dist/editor/services/mcpAccessService.d.ts +93 -0
  351. package/dist/editor/services/mcpAccessService.js +41 -0
  352. package/dist/editor/services/mcpAccessService.js.map +1 -0
  353. package/dist/editor/services/previewTokenService.d.ts +14 -0
  354. package/dist/editor/services/previewTokenService.js +34 -0
  355. package/dist/editor/services/previewTokenService.js.map +1 -0
  356. package/dist/editor/services/renderingsService.d.ts +117 -0
  357. package/dist/editor/services/renderingsService.js +245 -0
  358. package/dist/editor/services/renderingsService.js.map +1 -0
  359. package/dist/editor/services/spellCheckService.d.ts +13 -0
  360. package/dist/editor/services/spellCheckService.js +33 -0
  361. package/dist/editor/services/spellCheckService.js.map +1 -0
  362. package/dist/editor/settings/panels/McpAccessPanel.d.ts +7 -0
  363. package/dist/editor/settings/panels/McpAccessPanel.js +95 -0
  364. package/dist/editor/settings/panels/McpAccessPanel.js.map +1 -0
  365. package/dist/editor/settings/panels/McpAccessSettingsView.d.ts +8 -0
  366. package/dist/editor/settings/panels/McpAccessSettingsView.js +221 -0
  367. package/dist/editor/settings/panels/McpAccessSettingsView.js.map +1 -0
  368. package/dist/editor/settings/panels/SpellCheckPanel.d.ts +8 -0
  369. package/dist/editor/settings/panels/SpellCheckPanel.js +253 -0
  370. package/dist/editor/settings/panels/SpellCheckPanel.js.map +1 -0
  371. package/dist/editor/sidebar/FeedbackSidebar.d.ts +7 -0
  372. package/dist/editor/sidebar/FeedbackSidebar.js +300 -0
  373. package/dist/editor/sidebar/FeedbackSidebar.js.map +1 -0
  374. package/dist/editor/sidebar/OperationDetailsContent.js +50 -0
  375. package/dist/editor/sidebar/OperationDetailsContent.js.map +1 -1
  376. package/dist/editor/sidebar/liveComponentThumbnails.d.ts +19 -6
  377. package/dist/editor/sidebar/liveComponentThumbnails.js +39 -18
  378. package/dist/editor/sidebar/liveComponentThumbnails.js.map +1 -1
  379. package/dist/editor/spellcheck/canvasSpellCheckContextMenu.d.ts +30 -0
  380. package/dist/editor/spellcheck/canvasSpellCheckContextMenu.js +69 -0
  381. package/dist/editor/spellcheck/canvasSpellCheckContextMenu.js.map +1 -0
  382. package/dist/editor/spellcheck/htmlSpellDocument.d.ts +60 -0
  383. package/dist/editor/spellcheck/htmlSpellDocument.js +181 -0
  384. package/dist/editor/spellcheck/htmlSpellDocument.js.map +1 -0
  385. package/dist/editor/spellcheck/htmlSpellTokenizer.d.ts +45 -0
  386. package/dist/editor/spellcheck/htmlSpellTokenizer.js +277 -0
  387. package/dist/editor/spellcheck/htmlSpellTokenizer.js.map +1 -0
  388. package/dist/editor/spellcheck/replacementGuard.d.ts +27 -0
  389. package/dist/editor/spellcheck/replacementGuard.js +29 -0
  390. package/dist/editor/spellcheck/replacementGuard.js.map +1 -0
  391. package/dist/editor/spellcheck/spellCheckCanvasStore.d.ts +17 -0
  392. package/dist/editor/spellcheck/spellCheckCanvasStore.js +37 -0
  393. package/dist/editor/spellcheck/spellCheckCanvasStore.js.map +1 -0
  394. package/dist/editor/spellcheck/spellCheckCanvasTargets.d.ts +71 -0
  395. package/dist/editor/spellcheck/spellCheckCanvasTargets.js +126 -0
  396. package/dist/editor/spellcheck/spellCheckCanvasTargets.js.map +1 -0
  397. package/dist/editor/spellcheck/spellCheckClient.d.ts +66 -0
  398. package/dist/editor/spellcheck/spellCheckClient.js +0 -0
  399. package/dist/editor/spellcheck/spellCheckClient.js.map +1 -0
  400. package/dist/editor/spellcheck/spellCheckContextMenu.d.ts +52 -0
  401. package/dist/editor/spellcheck/spellCheckContextMenu.js +120 -0
  402. package/dist/editor/spellcheck/spellCheckContextMenu.js.map +1 -0
  403. package/dist/editor/spellcheck/spellCheckReplace.d.ts +8 -0
  404. package/dist/editor/spellcheck/spellCheckReplace.js +20 -0
  405. package/dist/editor/spellcheck/spellCheckReplace.js.map +1 -0
  406. package/dist/editor/spellcheck/spellCheckStyles.d.ts +11 -0
  407. package/dist/editor/spellcheck/spellCheckStyles.js +12 -0
  408. package/dist/editor/spellcheck/spellCheckStyles.js.map +1 -0
  409. package/dist/editor/spellcheck/spellCheckTypes.d.ts +94 -0
  410. package/dist/editor/spellcheck/spellCheckTypes.js +2 -0
  411. package/dist/editor/spellcheck/spellCheckTypes.js.map +1 -0
  412. package/dist/editor/spellcheck/textMarkHitTest.d.ts +14 -0
  413. package/dist/editor/spellcheck/textMarkHitTest.js +39 -0
  414. package/dist/editor/spellcheck/textMarkHitTest.js.map +1 -0
  415. package/dist/editor/spellcheck/useSpellCheck.d.ts +16 -0
  416. package/dist/editor/spellcheck/useSpellCheck.js +57 -0
  417. package/dist/editor/spellcheck/useSpellCheck.js.map +1 -0
  418. package/dist/editor/ui/DynamicRenderingsPublishWarning.d.ts +14 -0
  419. package/dist/editor/ui/DynamicRenderingsPublishWarning.js +40 -0
  420. package/dist/editor/ui/DynamicRenderingsPublishWarning.js.map +1 -0
  421. package/dist/editor/ui/ParheliaMark.d.ts +15 -0
  422. package/dist/editor/ui/ParheliaMark.js +12 -0
  423. package/dist/editor/ui/ParheliaMark.js.map +1 -0
  424. package/dist/editor/ui/RootItemPicker.d.ts +18 -0
  425. package/dist/editor/ui/RootItemPicker.js +112 -0
  426. package/dist/editor/ui/RootItemPicker.js.map +1 -0
  427. package/dist/editor/undoEligibility.d.ts +2 -0
  428. package/dist/editor/undoEligibility.js +8 -0
  429. package/dist/editor/undoEligibility.js.map +1 -0
  430. package/dist/editor/utils/dataTransferImages.d.ts +7 -0
  431. package/dist/editor/utils/dataTransferImages.js +43 -0
  432. package/dist/editor/utils/dataTransferImages.js.map +1 -0
  433. package/dist/editor/validation/navigateToValidationIssue.d.ts +2 -2
  434. package/dist/editor/validation/navigateToValidationIssue.js +1 -1
  435. package/dist/editor/validation/navigateToValidationIssue.js.map +1 -1
  436. package/dist/editor/validation/validationRulerIssues.d.ts +17 -0
  437. package/dist/editor/validation/validationRulerIssues.js +44 -0
  438. package/dist/editor/validation/validationRulerIssues.js.map +1 -0
  439. package/dist/revision.d.ts +2 -2
  440. package/dist/revision.js +2 -2
  441. package/dist/task-board/components/AttentionPromptDialog.d.ts +13 -0
  442. package/dist/task-board/components/AttentionPromptDialog.js +45 -0
  443. package/dist/task-board/components/AttentionPromptDialog.js.map +1 -0
  444. package/dist/task-board/components/GoalFindingsTable.d.ts +43 -0
  445. package/dist/task-board/components/GoalFindingsTable.js +160 -0
  446. package/dist/task-board/components/GoalFindingsTable.js.map +1 -0
  447. package/dist/task-board/components/IssuePanel.d.ts +31 -0
  448. package/dist/task-board/components/IssuePanel.js +268 -0
  449. package/dist/task-board/components/IssuePanel.js.map +1 -0
  450. package/dist/task-board/components/SubgoalFindings.d.ts +40 -0
  451. package/dist/task-board/components/SubgoalFindings.js +88 -0
  452. package/dist/task-board/components/SubgoalFindings.js.map +1 -0
  453. package/dist/task-board/services/issueService.d.ts +193 -0
  454. package/dist/task-board/services/issueService.js +97 -0
  455. package/dist/task-board/services/issueService.js.map +1 -0
  456. package/dist/task-board/taskBlockers.d.ts +10 -0
  457. package/dist/task-board/taskBlockers.js +66 -0
  458. package/dist/task-board/taskBlockers.js.map +1 -0
  459. package/dist/task-board/utils/projectDashboardModel.js +14 -0
  460. package/dist/task-board/utils/projectDashboardModel.js.map +1 -1
  461. package/dist/task-board/views/ProjectDashboardView.js +5 -13
  462. package/dist/task-board/views/ProjectDashboardView.js.map +1 -1
  463. package/dist/tour/sandbox-tour-copy.d.ts +8 -0
  464. package/dist/tour/sandbox-tour-copy.js +8 -0
  465. package/dist/tour/sandbox-tour-copy.js.map +1 -1
  466. package/dist/tour/sandbox-tour.d.ts +3 -0
  467. package/dist/tour/sandbox-tour.js +107 -3
  468. package/dist/tour/sandbox-tour.js.map +1 -1
  469. package/package.json +1 -1
  470. package/dist/editor/page-editor-chrome/bridgeLinkValue.d.ts +0 -10
  471. package/dist/editor/page-editor-chrome/bridgeLinkValue.js +0 -55
  472. package/dist/editor/page-editor-chrome/bridgeLinkValue.js.map +0 -1
@@ -0,0 +1,112 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { MessageCirclePlus } from "lucide-react";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+ import { CountBadge } from "../../components/ui/badge";
5
+ import { CloseButton } from "../../components/ui/close-button";
6
+ import { cn } from "../../lib/utils";
7
+ import { useEditContext } from "../client/editContext";
8
+ import { usePageViewState } from "./pageViewContext";
9
+ import { SuggestionsModeControl } from "../menubar/toolbar-sections/EditControls";
10
+ import { getFeedbackAnchor } from "../page-editor-chrome/overlay/feedbackAnchorMeasurements";
11
+ import { useFeedbackAnchors } from "../page-editor-chrome/overlay/feedbackAnchorStore";
12
+ import { CommentThreadCard } from "../reviews/CommentThreadCard";
13
+ import { beginAddComment, COMMENT_PICKER_IGNORE_ATTRIBUTE, stopCommentTargetPicking, useCommentTargetPicking, } from "../reviews/commentTargetPicker";
14
+ import { CommentTargetPickerDomLayer } from "../reviews/CommentTargetPickerDomLayer";
15
+ import { clearHoveredFeedback, setHoveredFeedback, } from "../reviews/feedbackHoverState";
16
+ import { FeedbackModeIntro } from "../reviews/FeedbackModeIntro";
17
+ import { FEEDBACK_SIDEBAR_TEXT_CLASS } from "../reviews/feedbackSidebarText";
18
+ import { resolveSelectedThreadId } from "../reviews/feedbackThreadSelection";
19
+ import { closeCommentsFeedback, enterSuggestionsMode, exitSuggestionsMode, isSuggestionsModeAvailable, } from "../reviews/openCommentsFeedback";
20
+ import { FEEDBACK_SCROLLABLE_ATTRIBUTE } from "../reviews/scrollWithin";
21
+ import { SuggestionThreadCard } from "../reviews/SuggestionThreadCard";
22
+ import { useFeedbackThreads } from "../reviews/useFeedbackThreads";
23
+ import { SimpleIconButton } from "../ui/SimpleIconButton";
24
+ import { getUnplacedLabel, SuggestingNotice, useElementHeight, useRevealPinnedCard, } from "./FeedbackMargin";
25
+ import { getCardBodyMaxHeight, orderMarginThreads, } from "./feedbackMarginLayout";
26
+ import { useRememberedMarginAnchors } from "./feedbackMarginSources";
27
+ export const MOBILE_COMMENTS_PANEL_DEFAULT_HEIGHT = 300;
28
+ export const MOBILE_COMMENTS_PANEL_MIN_HEIGHT = 160;
29
+ /**
30
+ * Draft comments lead the list whatever their anchor says: the composer is
31
+ * what the user is working in. Far above any page position, but finite,
32
+ * because the order compares anchors by subtraction.
33
+ */
34
+ const DRAFT_FALLBACK_Y = -1_000_000;
35
+ /**
36
+ * The phone's comments surface: the same thread cards as the desktop margin,
37
+ * as a plain list in the panel below the canvas, in page order. The canvas
38
+ * highlights publish where every thread's text sits; the list follows that
39
+ * order, drafts first, and threads the page does not render come last under
40
+ * a divider. Items without a canvas list their threads by activity.
41
+ *
42
+ * Selecting a card scrolls the canvas to the highlight and never opens the
43
+ * edit form (that would cover this panel); tapping the canvas does.
44
+ */
45
+ export function MobileCommentsPanel({ safeAreaInset, }) {
46
+ const editContext = useEditContext();
47
+ const feedback = useFeedbackThreads();
48
+ const { threads } = feedback;
49
+ const picking = useCommentTargetPicking();
50
+ const showComments = !!editContext?.showComments;
51
+ // Picking a target belongs to the comments surface: it ends when the
52
+ // comments are hidden and when this panel goes away.
53
+ useEffect(() => {
54
+ if (!showComments)
55
+ stopCommentTargetPicking();
56
+ }, [showComments]);
57
+ useEffect(() => stopCommentTargetPicking, []);
58
+ const [panelElement, setPanelElement] = useState(null);
59
+ const panelHeight = useElementHeight(panelElement);
60
+ const bodyMaxHeight = getCardBodyMaxHeight(panelHeight);
61
+ const slot = editContext?.getActiveSlotContext();
62
+ const iframe = usePageViewState(slot?.primaryPageViewContext, (state) => state.editorIframe) ?? null;
63
+ const hasLayout = isSuggestionsModeAvailable(editContext);
64
+ const { comments: commentAnchors, suggestions: suggestionAnchors } = useFeedbackAnchors(iframe);
65
+ const measure = useCallback((thread) => {
66
+ // Drafts lead the list; their anchor (the selected text) is ignored.
67
+ if (thread.kind === "comment" && thread.root.isNew)
68
+ return undefined;
69
+ return (getFeedbackAnchor(thread.kind === "comment"
70
+ ? commentAnchors[thread.id]
71
+ : suggestionAnchors[thread.id]) ?? undefined);
72
+ }, [commentAnchors, suggestionAnchors]);
73
+ const anchors = useRememberedMarginAnchors(threads, measure);
74
+ const { orderedIds, unplacedIds } = useMemo(() => {
75
+ if (!hasLayout) {
76
+ // No canvas, no anchors: the threads come ordered by activity.
77
+ return {
78
+ orderedIds: threads.map((thread) => thread.id),
79
+ unplacedIds: [],
80
+ };
81
+ }
82
+ const order = orderMarginThreads(threads, anchors, DRAFT_FALLBACK_Y);
83
+ return {
84
+ orderedIds: order.anchored.map((entry) => entry.id),
85
+ unplacedIds: order.unplaced,
86
+ };
87
+ }, [hasLayout, threads, anchors]);
88
+ const pinnedId = resolveSelectedThreadId(threads, editContext?.selectedComment, editContext?.selectedSuggestedEdit);
89
+ const listRef = useRef(null);
90
+ useRevealPinnedCard(listRef, pinnedId, true);
91
+ const threadsById = useMemo(() => new Map(threads.map((thread) => [thread.id, thread])), [threads]);
92
+ const renderCard = (id, context) => {
93
+ const thread = threadsById.get(id);
94
+ if (!thread)
95
+ return null;
96
+ const selected = id === pinnedId;
97
+ const dimmed = !!pinnedId && id !== pinnedId;
98
+ const onHoverChange = (hovered) => hovered
99
+ ? setHoveredFeedback({ kind: thread.kind, id: thread.id })
100
+ : clearHoveredFeedback(thread.id);
101
+ const card = thread.kind === "suggestion" ? (_jsx(SuggestionThreadCard, { thread: thread, getAuthorName: feedback.getAuthorName, resolvedAuthorNames: feedback.resolvedAuthorNames, navigation: "select", bodyMaxHeight: bodyMaxHeight, balloon: true, showContext: context, onHoverChange: onHoverChange })) : (_jsx(CommentThreadCard, { thread: thread, availableTags: feedback.availableTags, getAuthorName: feedback.getAuthorName, resolvedAuthorNames: feedback.resolvedAuthorNames, selected: selected, navigation: "select", bodyMaxHeight: bodyMaxHeight, balloon: true, showContext: context, onHoverChange: onHoverChange }));
102
+ return (_jsx("div", { "data-feedback-margin-card": id, className: cn("transition-opacity duration-150", dimmed && "opacity-70"), children: card }, id));
103
+ };
104
+ if (!editContext)
105
+ return null;
106
+ const unresolvedCount = editContext.comments?.filter((comment) => !comment.isResolved).length || 0;
107
+ const showEmptyState = threads.length === 0 &&
108
+ feedback.commentsLoaded &&
109
+ !feedback.isSuggestionsMode;
110
+ return (_jsxs("div", { ref: setPanelElement, "data-testid": "comments-suggestions-panel", "data-feedback-surface": "mobile", className: cn(FEEDBACK_SIDEBAR_TEXT_CLASS, "bg-neutral-grey-5 flex h-full w-full flex-col select-text", safeAreaInset && "pb-[env(safe-area-inset-bottom)]"), children: [_jsxs("div", { "data-testid": "mobile-comments-header", className: "border-border-default flex shrink-0 items-center gap-1 border-b bg-white py-1 pr-1 pl-3", [COMMENT_PICKER_IGNORE_ATTRIBUTE]: "", children: [_jsxs("span", { className: "text-neutral-grey-100 min-w-0 flex-1 truncate text-sm font-medium", children: ["Comments", unresolvedCount > 0 && (_jsx(CountBadge, { className: "ml-2 min-w-[16px] align-middle", children: unresolvedCount > 99 ? "99+" : unresolvedCount }))] }), _jsx(SimpleIconButton, { icon: _jsx(MessageCirclePlus, { strokeWidth: 1, className: "h-6 w-6 p-1" }), label: picking ? "Tap what to comment on" : "Add a comment", size: "small", selected: picking, "data-testid": "mobile-comments-add-button", onClick: () => beginAddComment(editContext) }), hasLayout && _jsx(SuggestionsModeControl, {}), _jsx(CloseButton, { label: "Close comments", "data-testid": "mobile-comments-close-button", onClick: () => closeCommentsFeedback(editContext) })] }), picking && (_jsxs(_Fragment, { children: [_jsx("p", { "data-testid": "mobile-comments-picking-hint", className: "text-neutral-grey-50 bg-white px-3 pb-1.5 text-xs", children: "Tap what you want to comment on." }), _jsx(CommentTargetPickerDomLayer, {})] })), feedback.isSuggestionsMode && (_jsx(SuggestingNotice, { className: "shrink-0", onStopSuggesting: () => exitSuggestionsMode(editContext, { reason: "sidebar" }) })), showEmptyState ? (_jsx("div", { className: "min-h-0 flex-1 overflow-auto px-2 pt-2", [COMMENT_PICKER_IGNORE_ATTRIBUTE]: "", children: _jsx(FeedbackModeIntro, { variant: "empty", canSuggest: feedback.suggestionsAvailable, onAddComment: () => beginAddComment(editContext), onStartSuggesting: () => enterSuggestionsMode(editContext, { reason: "sidebar" }) }) })) : (_jsxs("div", { ref: listRef, "data-testid": "mobile-comments-list", className: "min-h-0 flex-1 space-y-3 overflow-auto p-3", [FEEDBACK_SCROLLABLE_ATTRIBUTE]: "", children: [orderedIds.map((id) => renderCard(id, false)), unplacedIds.length > 0 && (_jsx("p", { "data-testid": "mobile-comments-unplaced-divider", className: "text-neutral-grey-50 border-border-default border-t px-0.5 pt-2 text-xs font-medium", children: getUnplacedLabel(unplacedIds.length, "overlay") })), unplacedIds.map((id) => renderCard(id, true))] }))] }));
111
+ }
112
+ //# sourceMappingURL=MobileCommentsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MobileCommentsPanel.js","sourceRoot":"","sources":["../../../src/editor/page-viewer/MobileCommentsPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { RenderingCheck } from "../services/renderingsService";
2
+ type RenderingAiCheckPanelProps = {
3
+ check?: RenderingCheck;
4
+ /** The check request itself failed. */
5
+ error?: string;
6
+ checking: boolean;
7
+ /** Administrators may check the same code again. */
8
+ canRecheck: boolean;
9
+ onRecheck: () => void;
10
+ onRetry: () => void;
11
+ };
12
+ /**
13
+ * The AI check of the rendering's code in the review dialog: a summary and
14
+ * the findings by severity. A high finding blocks the approval until an
15
+ * administrator gives a reason to approve anyway.
16
+ */
17
+ export declare function RenderingAiCheckPanel({ check, error, checking, canRecheck, onRecheck, onRetry, }: RenderingAiCheckPanelProps): import("react").JSX.Element;
18
+ export {};
@@ -0,0 +1,45 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CheckCircle2, RefreshCw, Sparkles } from "lucide-react";
3
+ import { Badge } from "../../components/ui/badge";
4
+ import { Button } from "../../components/ui/button";
5
+ import { cn } from "../../lib/utils";
6
+ import { Spinner } from "../ui/Spinner";
7
+ import { formatApprovalDate, stripAccountDomain } from "./renderingApproval";
8
+ const SEVERITY_LABELS = {
9
+ high: "High",
10
+ medium: "Medium",
11
+ low: "Low",
12
+ };
13
+ const SEVERITY_CLASSES = {
14
+ high: "border-transparent bg-feedback-red-light text-feedback-red",
15
+ medium: "border-transparent bg-feedback-orange-light text-feedback-orange",
16
+ low: "border-transparent bg-neutral-grey-10 text-neutral-grey-100",
17
+ };
18
+ function describeLocation(finding) {
19
+ const where = finding.source === "clientCode"
20
+ ? "Client code"
21
+ : finding.source === "code"
22
+ ? "Code"
23
+ : undefined;
24
+ if (!where)
25
+ return finding.line ? `Line ${finding.line}` : undefined;
26
+ return finding.line ? `${where}, line ${finding.line}` : where;
27
+ }
28
+ function Finding({ finding }) {
29
+ const location = describeLocation(finding);
30
+ return (_jsxs("li", { className: "flex flex-col gap-1", "data-testid": "rendering-ai-check-finding", "data-severity": finding.severity, children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Badge, { size: "sm", variant: "secondary", className: SEVERITY_CLASSES[finding.severity], children: SEVERITY_LABELS[finding.severity] }), _jsx("span", { className: "font-medium", children: finding.title }), location && (_jsx("span", { className: "text-muted-foreground text-xs", children: location }))] }), finding.detail && (_jsx("p", { className: "text-neutral-grey-100 text-xs", children: finding.detail })), finding.excerpt && (_jsx("code", { className: "bg-neutral-grey-5 text-neutral-grey-100 block overflow-x-auto rounded px-2 py-1 font-mono text-xs whitespace-pre", children: finding.excerpt }))] }));
31
+ }
32
+ /**
33
+ * The AI check of the rendering's code in the review dialog: a summary and
34
+ * the findings by severity. A high finding blocks the approval until an
35
+ * administrator gives a reason to approve anyway.
36
+ */
37
+ export function RenderingAiCheckPanel({ check, error, checking, canRecheck, onRecheck, onRetry, }) {
38
+ const checkedAt = formatApprovalDate(check?.checkedAt ?? undefined);
39
+ const byLine = [check?.model, checkedAt].filter(Boolean).join(" · ");
40
+ const failed = !checking && (!!error || check?.status === "failed");
41
+ return (_jsxs("section", { className: cn("border-border-default flex shrink-0 flex-col gap-2 rounded-md border p-3", check?.blocks && "border-feedback-red bg-feedback-red-light/40"), "data-testid": "rendering-ai-check", "data-status": checking ? "checking" : error ? "error" : check?.status, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Sparkles, { className: "h-4 w-4 shrink-0", strokeWidth: 1.5 }), _jsx("h3", { className: "text-sm font-medium", children: "AI check" }), byLine && check?.status === "checked" && !checking && (_jsx("span", { className: "text-muted-foreground truncate text-xs", children: byLine })), _jsxs("div", { className: "ml-auto flex items-center gap-1", children: [failed && (_jsxs(Button, { variant: "ghost", size: "xs", onClick: onRetry, "data-testid": "rendering-ai-check-retry", children: [_jsx(RefreshCw, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "Try again"] })), !failed && canRecheck && check?.status === "checked" && (_jsxs(Button, { variant: "ghost", size: "xs", onClick: onRecheck, disabled: checking, "data-testid": "rendering-ai-check-recheck", children: [_jsx(RefreshCw, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "Check again"] }))] })] }), checking ? (_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-xs", children: [_jsx(Spinner, { size: "sm" }), " Checking the code. This can take a minute."] })) : error ? (_jsx("p", { className: "text-muted-foreground text-xs", children: error })) : !check ? null : check.status !== "checked" ? (_jsx("p", { className: "text-muted-foreground text-xs", children: check.message ?? "The code was not checked." })) : (_jsxs(_Fragment, { children: [check.summary && _jsx("p", { className: "text-xs", children: check.summary }), check.findings.length === 0 ? (_jsxs("p", { className: "text-feedback-green flex items-center gap-1.5 text-xs", children: [_jsx(CheckCircle2, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "No problems found."] })) : (_jsx("ul", { className: "flex flex-col gap-3", children: check.findings.map((finding, index) => (_jsx(Finding, { finding: finding }, index))) })), check.overrides.length > 0 && (_jsx("ul", { className: "text-muted-foreground flex flex-col gap-1 border-t pt-2 text-xs", "data-testid": "rendering-ai-check-overrides", children: check.overrides.map((entry, index) => (_jsxs("li", { children: ["Approved anyway by ", stripAccountDomain(entry.by), formatApprovalDate(entry.at)
42
+ ? ` on ${formatApprovalDate(entry.at)}`
43
+ : "", ": ", entry.reason] }, index))) }))] }))] }));
44
+ }
45
+ //# sourceMappingURL=RenderingAiCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderingAiCheck.js","sourceRoot":"","sources":["../../../src/editor/page-viewer/RenderingAiCheck.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAMrC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,eAAe,GAA2C;IAC9D,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,gBAAgB,GAA2C;IAC/D,IAAI,EAAE,4DAA4D;IAClE,MAAM,EAAE,kEAAkE;IAC1E,GAAG,EAAE,6DAA6D;CACnE,CAAC;AAEF,SAAS,gBAAgB,CAAC,OAA8B;IACtD,MAAM,KAAK,GACT,OAAO,CAAC,MAAM,KAAK,YAAY;QAC7B,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM;YACzB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,SAAS,CAAC;IAClB,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACjE,CAAC;AAED,SAAS,OAAO,CAAC,EAAE,OAAO,EAAsC;IAC9D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,CACL,cACE,SAAS,EAAC,qBAAqB,iBACnB,4BAA4B,mBACzB,OAAO,CAAC,QAAQ,aAE/B,eAAK,SAAS,EAAC,mCAAmC,aAChD,KAAC,KAAK,IACJ,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,WAAW,EACnB,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,YAE5C,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAC5B,EACR,eAAM,SAAS,EAAC,aAAa,YAAE,OAAO,CAAC,KAAK,GAAQ,EACnD,QAAQ,IAAI,CACX,eAAM,SAAS,EAAC,+BAA+B,YAAE,QAAQ,GAAQ,CAClE,IACG,EACL,OAAO,CAAC,MAAM,IAAI,CACjB,YAAG,SAAS,EAAC,+BAA+B,YAAE,OAAO,CAAC,MAAM,GAAK,CAClE,EACA,OAAO,CAAC,OAAO,IAAI,CAClB,eAAM,SAAS,EAAC,kHAAkH,YAC/H,OAAO,CAAC,OAAO,GACX,CACR,IACE,CACN,CAAC;AACJ,CAAC;AAaD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,UAAU,EACV,SAAS,EACT,OAAO,GACoB;IAC3B,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC;IAEpE,OAAO,CACL,mBACE,SAAS,EAAE,EAAE,CACX,0EAA0E,EAC1E,KAAK,EAAE,MAAM,IAAI,8CAA8C,CAChE,iBACW,oBAAoB,iBACnB,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,aAEpE,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,QAAQ,IAAC,SAAS,EAAC,kBAAkB,EAAC,WAAW,EAAE,GAAG,GAAI,EAC3D,aAAI,SAAS,EAAC,qBAAqB,yBAAc,EAChD,MAAM,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,IAAI,CACrD,eAAM,SAAS,EAAC,wCAAwC,YACrD,MAAM,GACF,CACR,EACD,eAAK,SAAS,EAAC,iCAAiC,aAC7C,MAAM,IAAI,CACT,MAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,OAAO,iBACJ,0BAA0B,aAEtC,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,EAAC,WAAW,EAAE,GAAG,GAAI,iBAEhD,CACV,EACA,CAAC,MAAM,IAAI,UAAU,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,IAAI,CACvD,MAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,QAAQ,iBACN,4BAA4B,aAExC,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,EAAC,WAAW,EAAE,GAAG,GAAI,mBAEhD,CACV,IACG,IACF,EAEL,QAAQ,CAAC,CAAC,CAAC,CACV,eAAK,SAAS,EAAC,uDAAuD,aACpE,KAAC,OAAO,IAAC,IAAI,EAAC,IAAI,GAAG,mDACjB,CACP,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACV,YAAG,SAAS,EAAC,+BAA+B,YAAE,KAAK,GAAK,CACzD,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAC/C,YAAG,SAAS,EAAC,+BAA+B,YACzC,KAAK,CAAC,OAAO,IAAI,2BAA2B,GAC3C,CACL,CAAC,CAAC,CAAC,CACF,8BACG,KAAK,CAAC,OAAO,IAAI,YAAG,SAAS,EAAC,SAAS,YAAE,KAAK,CAAC,OAAO,GAAK,EAC3D,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC7B,aAAG,SAAS,EAAC,uDAAuD,aAClE,KAAC,YAAY,IAAC,SAAS,EAAC,aAAa,EAAC,WAAW,EAAE,GAAG,GAAI,0BAExD,CACL,CAAC,CAAC,CAAC,CACF,aAAI,SAAS,EAAC,qBAAqB,YAChC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CACtC,KAAC,OAAO,IAAa,OAAO,EAAE,OAAO,IAAvB,KAAK,CAAsB,CAC1C,CAAC,GACC,CACN,EACA,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAC7B,aACE,SAAS,EAAC,iEAAiE,iBAC/D,8BAA8B,YAEzC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CACrC,gDACsB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,EAC/C,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;oCAC3B,CAAC,CAAC,OAAO,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;oCACvC,CAAC,CAAC,EAAE,QACH,KAAK,CAAC,MAAM,KALR,KAAK,CAMT,CACN,CAAC,GACC,CACN,IACA,CACJ,IACO,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type PageVersion, type RenderingState } from "../services/renderingsService";
2
+ /** Who approved when, or what the state means, in one sentence. */
3
+ export declare function describeApproval(rendering: RenderingState): string;
4
+ type RenderingApprovalDialogProps = {
5
+ rendering: RenderingState;
6
+ onClose: () => void;
7
+ /** The rendering's approval state changed or may have: reload it. */
8
+ onChanged: () => void;
9
+ /** The user may approve (an administrator, not a sandbox). */
10
+ canApprove?: boolean;
11
+ /** The page the rendering is reviewed on: its client code can be tried there. */
12
+ page?: PageVersion;
13
+ /** The preview canvas URL, whose query the sealed frame loads the page with. */
14
+ getCanvasUrl?: () => string | undefined;
15
+ };
16
+ /**
17
+ * For administrators and, in a sandbox, its owner (the CM refuses the code,
18
+ * the AI check and the preview token to everyone else): shows a rendering's
19
+ * code and client code read-only, runs the page with its client code in a
20
+ * sealed frame on request, and lets an administrator approve exactly that
21
+ * code: the approval carries the hash of what was loaded, and the CM refuses
22
+ * it when the code changed since.
23
+ */
24
+ export declare function RenderingApprovalDialog({ rendering, onClose, onChanged, canApprove: userCanApprove, page, getCanvasUrl, }: RenderingApprovalDialogProps): import("react").JSX.Element;
25
+ type RevokeRenderingDialogProps = {
26
+ rendering: RenderingState;
27
+ onClose: () => void;
28
+ onChanged: () => void;
29
+ };
30
+ /** Confirms revoking an approval, which published pages feel at once. */
31
+ export declare function RevokeRenderingDialog({ rendering, onClose, onChanged, }: RevokeRenderingDialogProps): import("react").JSX.Element;
32
+ export {};
@@ -0,0 +1,191 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { AlertCircle, ShieldCheckIcon } from "lucide-react";
4
+ import { toast } from "sonner";
5
+ import { Alert, AlertDescription } from "../../components/ui/alert";
6
+ import { AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "../../components/ui/alert-dialog";
7
+ import { Badge } from "../../components/ui/badge";
8
+ import { Button } from "../../components/ui/button";
9
+ import { Dialog, DialogContent, DialogFooter, } from "../../components/ui/dialog";
10
+ import { StyledDialogTitle } from "../../components/ui/styled-dialog-title";
11
+ import { Textarea } from "../../components/ui/textarea";
12
+ import { approveRendering, checkRendering, fetchRenderingSource, revokeRendering, } from "../services/renderingsService";
13
+ import { LoadingState } from "../ui/LoadingState";
14
+ import { Spinner } from "../ui/Spinner";
15
+ import { RenderingAiCheckPanel } from "./RenderingAiCheck";
16
+ import { SealedClientCodePreview } from "./SealedClientCodePreview";
17
+ import { formatApprovalDate, getRenderingApprovalStatus, getRenderingDisplayName, RENDERING_APPROVAL_BADGE_CLASSES, RENDERING_APPROVAL_LABELS, stripAccountDomain, } from "./renderingApproval";
18
+ /** Who approved when, or what the state means, in one sentence. */
19
+ export function describeApproval(rendering) {
20
+ const status = getRenderingApprovalStatus(rendering);
21
+ const by = rendering.approvedBy
22
+ ? stripAccountDomain(rendering.approvedBy)
23
+ : undefined;
24
+ const at = formatApprovalDate(rendering.approvedAt);
25
+ const who = [by && `by ${by}`, at && `on ${at}`].filter(Boolean).join(" ");
26
+ switch (status) {
27
+ case "sandbox":
28
+ return "Renderings in a sandbox cannot be approved, so their client code runs only in this review.";
29
+ case "approved":
30
+ return who ? `Approved ${who}.` : "Approved.";
31
+ case "changed":
32
+ return who
33
+ ? `An earlier version was approved ${who}. The code changed since.`
34
+ : "An earlier version was approved. The code changed since.";
35
+ case "unapproved":
36
+ return "Not approved yet. Published pages do not show this rendering.";
37
+ }
38
+ }
39
+ function CodeBlock({ label, code, emptyText, testId, }) {
40
+ return (_jsxs("section", { className: "flex shrink-0 flex-col gap-1.5", children: [_jsx("h3", { className: "text-sm font-medium", children: label }), code ? (_jsx("pre", { className: "border-border-default bg-neutral-grey-5 text-neutral-grey-100 max-h-[40vh] overflow-auto rounded-md border p-3 font-mono text-xs leading-relaxed whitespace-pre", "data-testid": testId, tabIndex: 0, children: _jsx("code", { children: code }) })) : (_jsx("p", { className: "text-muted-foreground text-xs", "data-testid": testId, children: emptyText }))] }));
41
+ }
42
+ /**
43
+ * For administrators and, in a sandbox, its owner (the CM refuses the code,
44
+ * the AI check and the preview token to everyone else): shows a rendering's
45
+ * code and client code read-only, runs the page with its client code in a
46
+ * sealed frame on request, and lets an administrator approve exactly that
47
+ * code: the approval carries the hash of what was loaded, and the CM refuses
48
+ * it when the code changed since.
49
+ */
50
+ export function RenderingApprovalDialog({ rendering, onClose, onChanged, canApprove: userCanApprove = false, page, getCanvasUrl, }) {
51
+ const [source, setSource] = useState();
52
+ const [loadError, setLoadError] = useState();
53
+ const [loadRevision, setLoadRevision] = useState(0);
54
+ const [approving, setApproving] = useState(false);
55
+ const [approveError, setApproveError] = useState();
56
+ const [changedWhileReviewing, setChangedWhileReviewing] = useState(false);
57
+ const [checkResult, setCheckResult] = useState();
58
+ const [checkRequest, setCheckRequest] = useState({
59
+ revision: 0,
60
+ rerun: false,
61
+ });
62
+ const [overrideReason, setOverrideReason] = useState("");
63
+ const renderingId = rendering.id;
64
+ useEffect(() => {
65
+ const controller = new AbortController();
66
+ void fetchRenderingSource(renderingId, controller.signal).then((result) => {
67
+ if (controller.signal.aborted)
68
+ return;
69
+ if (result.ok) {
70
+ setSource(result.data);
71
+ setLoadError(undefined);
72
+ }
73
+ else {
74
+ setSource(undefined);
75
+ setLoadError(result.message);
76
+ }
77
+ });
78
+ return () => controller.abort();
79
+ }, [renderingId, loadRevision]);
80
+ // The AI check of exactly the loaded code: cached on the CM per approval
81
+ // hash, so reopening the review is instant; new code is checked again.
82
+ // Sandbox renderings are never approved, so they are not checked.
83
+ // Each result is kept with the request it answers, so new code or "Check
84
+ // again" shows as pending from its first render.
85
+ const checkedId = source && !source.sandbox ? source.id : undefined;
86
+ const checkKey = checkedId
87
+ ? `${checkedId}|${source?.hash}|${loadRevision}|${checkRequest.revision}`
88
+ : undefined;
89
+ useEffect(() => {
90
+ if (!checkedId || !checkKey)
91
+ return;
92
+ const controller = new AbortController();
93
+ void checkRendering(checkedId, {
94
+ rerun: checkRequest.rerun,
95
+ signal: controller.signal,
96
+ }).then((result) => {
97
+ if (controller.signal.aborted)
98
+ return;
99
+ setCheckResult(result.ok
100
+ ? { key: checkKey, check: result.data }
101
+ : { key: checkKey, error: result.message });
102
+ });
103
+ return () => controller.abort();
104
+ }, [checkedId, checkKey, checkRequest.rerun]);
105
+ const current = checkResult?.key === checkKey ? checkResult : undefined;
106
+ const check = current?.check;
107
+ const checkPending = !!checkKey && !current;
108
+ const runCheck = (rerun) => setCheckRequest((request) => ({ revision: request.revision + 1, rerun }));
109
+ const reloadSource = () => {
110
+ setSource(undefined);
111
+ setLoadError(undefined);
112
+ setOverrideReason("");
113
+ setLoadRevision((value) => value + 1);
114
+ };
115
+ // A high finding of the check of this exact code blocks the approval until
116
+ // the administrator gives a reason, which the CM records.
117
+ const blocked = !!source && !!check?.blocks && check.hash === source.hash;
118
+ const reason = overrideReason.trim();
119
+ const approve = async () => {
120
+ if (!source || approving)
121
+ return;
122
+ if (blocked && !reason)
123
+ return;
124
+ setApproving(true);
125
+ setApproveError(undefined);
126
+ const result = blocked
127
+ ? await approveRendering(source.id, source.hash, reason)
128
+ : await approveRendering(source.id, source.hash);
129
+ setApproving(false);
130
+ if (result.ok) {
131
+ toast.success(`${getRenderingDisplayName(source)} is approved. Published pages show it once it is published.`);
132
+ onChanged();
133
+ onClose();
134
+ return;
135
+ }
136
+ if (result.status === 409) {
137
+ // Someone saved new code after this dialog loaded it: show the current
138
+ // code, which has to be reviewed before it can be approved.
139
+ setChangedWhileReviewing(true);
140
+ reloadSource();
141
+ onChanged();
142
+ return;
143
+ }
144
+ if (result.status === 422) {
145
+ // The CM's check found high-severity problems this dialog did not show
146
+ // yet (it ran the check itself): show them, ask for a reason.
147
+ runCheck(false);
148
+ }
149
+ setApproveError(result.message);
150
+ };
151
+ const shown = source ?? rendering;
152
+ const status = getRenderingApprovalStatus(shown);
153
+ const offersApproval = userCanApprove && !shown.sandbox && !shown.approved;
154
+ const canApprove = offersApproval && !!source && !checkPending && (!blocked || !!reason);
155
+ return (_jsx(Dialog, { open: true, onOpenChange: (open) => {
156
+ if (!open)
157
+ onClose();
158
+ }, children: _jsxs(DialogContent, { className: "flex w-[90%] max-w-4xl flex-col overflow-hidden border-none p-0 shadow-2xl", style: { maxHeight: "90vh" }, "data-testid": "rendering-approval-dialog", children: [_jsx(StyledDialogTitle, { icon: _jsx(ShieldCheckIcon, { strokeWidth: 1 }), title: "Review rendering", subtitle: getRenderingDisplayName(shown) }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto px-6 py-5 text-sm", children: [changedWhileReviewing && (_jsxs(Alert, { variant: "warning", "data-testid": "rendering-approval-changed", children: [_jsx(AlertCircle, { strokeWidth: 1.5, className: "h-4 w-4" }), _jsx(AlertDescription, { children: "The code changed while you were reviewing it. This is the current code; review it before you approve it." })] })), approveError && (_jsxs(Alert, { variant: "destructive", "data-testid": "rendering-approval-error", children: [_jsx(AlertCircle, { strokeWidth: 1.5, className: "h-4 w-4" }), _jsx(AlertDescription, { children: approveError })] })), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Badge, { size: "sm", variant: "secondary", className: RENDERING_APPROVAL_BADGE_CLASSES[status], children: RENDERING_APPROVAL_LABELS[status] }), _jsx("span", { className: "text-muted-foreground", "data-testid": "rendering-approval-state", children: describeApproval(shown) })] }), shown.path && (_jsx("p", { className: "text-muted-foreground -mt-2 text-xs break-all", children: shown.path })), loadError ? (_jsxs(Alert, { variant: "destructive", "data-testid": "rendering-source-error", children: [_jsx(AlertCircle, { strokeWidth: 1.5, className: "h-4 w-4" }), _jsx(AlertDescription, { children: loadError })] })) : !source ? (_jsx(LoadingState, { variant: "inline", message: "Loading the code..." })) : (_jsxs(_Fragment, { children: [!source.sandbox && (_jsx(RenderingAiCheckPanel, { check: check, error: current?.error, checking: checkPending, canRecheck: userCanApprove, onRecheck: () => runCheck(true), onRetry: () => runCheck(false) })), _jsx(CodeBlock, { label: "Code", code: source.code, emptyText: "No code.", testId: "rendering-approval-code" }), _jsx(CodeBlock, { label: "Client code", code: source.clientCode, emptyText: "No client code.", testId: "rendering-approval-client-code" }), source.clientCode && page && (_jsx(SealedClientCodePreview, { page: page, renderingId: source.id, getCanvasUrl: getCanvasUrl })), offersApproval && blocked && (_jsxs("section", { className: "flex shrink-0 flex-col gap-1.5", children: [_jsx("label", { htmlFor: "rendering-override-reason", className: "text-sm font-medium", children: "Reason to approve anyway" }), _jsxs("p", { className: "text-muted-foreground text-xs", children: [check?.status === "failed"
159
+ ? "The AI check could not check this code."
160
+ : "The AI check found high-severity problems.", " ", "To approve this code anyway, say why. The reason is recorded with the findings."] }), _jsx(Textarea, { id: "rendering-override-reason", value: overrideReason, onChange: (event) => setOverrideReason(event.target.value), maxLength: 2000, rows: 2, "data-testid": "rendering-override-reason" })] })), offersApproval && (_jsx("p", { className: "text-muted-foreground text-xs", children: "Approving covers exactly this code. Published pages show the rendering once it is published; any later change to the code ends the approval." }))] }))] }), _jsxs(DialogFooter, { className: "mt-auto shrink-0 border-t bg-white px-6 py-4", children: [_jsx(Button, { variant: "outline", onClick: onClose, children: "Close" }), offersApproval && (_jsx(Button, { onClick: approve, disabled: !canApprove || approving, variant: blocked ? "destructive" : undefined, title: checkPending
161
+ ? "Waiting for the AI check"
162
+ : blocked && !reason
163
+ ? "Give a reason to approve anyway"
164
+ : undefined, "data-testid": "rendering-approve", children: approving ? (_jsxs(_Fragment, { children: [_jsx(Spinner, { size: "sm" }), " Approving..."] })) : (_jsxs(_Fragment, { children: [_jsx(ShieldCheckIcon, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), blocked ? "Approve anyway" : "Approve"] })) }))] })] }) }));
165
+ }
166
+ /** Confirms revoking an approval, which published pages feel at once. */
167
+ export function RevokeRenderingDialog({ rendering, onClose, onChanged, }) {
168
+ const [revoking, setRevoking] = useState(false);
169
+ const [error, setError] = useState();
170
+ const name = getRenderingDisplayName(rendering);
171
+ const revoke = async () => {
172
+ if (revoking)
173
+ return;
174
+ setRevoking(true);
175
+ setError(undefined);
176
+ const result = await revokeRendering(rendering.id);
177
+ setRevoking(false);
178
+ if (!result.ok) {
179
+ setError(result.message);
180
+ return;
181
+ }
182
+ toast.success(`The approval of ${name} is revoked.`);
183
+ onChanged();
184
+ onClose();
185
+ };
186
+ return (_jsx(AlertDialog, { open: true, onOpenChange: (open) => {
187
+ if (!open && !revoking)
188
+ onClose();
189
+ }, children: _jsxs(AlertDialogContent, { "data-testid": "rendering-revoke-dialog", children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Revoke approval?" }), _jsxs(AlertDialogDescription, { children: ["Published pages stop showing ", name, " right away, without a publish. It shows again once an administrator approves it again and it is published."] })] }), error && (_jsx("p", { role: "alert", className: "text-feedback-red text-sm", "data-testid": "rendering-revoke-error", children: error })), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: revoking, children: "Cancel" }), _jsx(Button, { variant: "destructive", size: "lg", onClick: revoke, disabled: revoking, "data-testid": "rendering-revoke-confirm", children: revoking ? (_jsxs(_Fragment, { children: [_jsx(Spinner, { size: "sm" }), " Revoking..."] })) : ("Revoke") })] })] }) }));
190
+ }
191
+ //# sourceMappingURL=RenderingApprovalDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderingApprovalDialog.js","sourceRoot":"","sources":["../../../src/editor/page-viewer/RenderingApprovalDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { PageVersion } from "../services/renderingsService";
2
+ type SealedClientCodePreviewProps = {
3
+ /** The page the rendering is reviewed on. */
4
+ page: PageVersion;
5
+ renderingId: string;
6
+ /** The preview canvas URL whose query the sealed frame loads the page with. */
7
+ getCanvasUrl?: () => string | undefined;
8
+ };
9
+ /**
10
+ * Runs the page with all of its client code, approved or not, in a sealed
11
+ * frame inside the review dialog: `sandbox="allow-scripts"` only, so the
12
+ * document has an opaque origin (no cookies, no access to the editor or the
13
+ * CM session) and reads the page with a short-lived preview token. The canvas
14
+ * stays the canvas meanwhile.
15
+ */
16
+ export declare function SealedClientCodePreview({ page, renderingId, getCanvasUrl, }: SealedClientCodePreviewProps): import("react").JSX.Element;
17
+ export {};
@@ -0,0 +1,38 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { AlertCircle, PlayIcon, RotateCwIcon, SquareIcon } from "lucide-react";
4
+ import { Alert, AlertDescription } from "../../components/ui/alert";
5
+ import { Button } from "../../components/ui/button";
6
+ import { Spinner } from "../ui/Spinner";
7
+ import { INTERACTIVE_PREVIEW_SANDBOX } from "./interactivePreview";
8
+ import { useInteractivePreview } from "./useInteractivePreview";
9
+ /**
10
+ * Runs the page with all of its client code, approved or not, in a sealed
11
+ * frame inside the review dialog: `sandbox="allow-scripts"` only, so the
12
+ * document has an opaque origin (no cookies, no access to the editor or the
13
+ * CM session) and reads the page with a short-lived preview token. The canvas
14
+ * stays the canvas meanwhile.
15
+ */
16
+ export function SealedClientCodePreview({ page, renderingId, getCanvasUrl, }) {
17
+ const [error, setError] = useState();
18
+ const preview = useInteractivePreview({
19
+ mode: "preview",
20
+ page,
21
+ onError: setError,
22
+ });
23
+ const { setHint, start, stop, reload } = preview;
24
+ // The session runs only for a page with client code; this is the rendering
25
+ // being reviewed.
26
+ useEffect(() => {
27
+ setHint({ renderingIds: [renderingId], clientCodeIds: [renderingId] });
28
+ }, [renderingId, setHint]);
29
+ const [loadedFrameKey, setLoadedFrameKey] = useState();
30
+ const running = preview.active && !!preview.frameUrl;
31
+ const loading = preview.status === "starting" ||
32
+ (running && loadedFrameKey !== preview.frameKey);
33
+ return (_jsxs("section", { className: "flex shrink-0 flex-col gap-2", "data-testid": "sealed-client-code-preview", "data-state": preview.status, children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("h3", { className: "text-sm font-medium", children: "Try the client code" }), _jsxs("div", { className: "ml-auto flex items-center gap-2", children: [loading && _jsx(Spinner, { size: "xs" }), preview.status === "off" ? (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => {
34
+ setError(undefined);
35
+ start(getCanvasUrl?.());
36
+ }, "data-testid": "sealed-preview-run", children: [_jsx(PlayIcon, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "Run client code"] })) : (_jsxs(_Fragment, { children: [_jsxs(Button, { variant: "outline", size: "sm", disabled: !running, onClick: () => reload(getCanvasUrl?.()), "data-testid": "sealed-preview-reload", children: [_jsx(RotateCwIcon, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "Reload"] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: stop, "data-testid": "sealed-preview-stop", children: [_jsx(SquareIcon, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), "Stop"] })] }))] })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Runs this page with all of its client code in a sealed frame. The code has no access to the editor, your session or cookies, and nothing here is saved." }), error && (_jsxs(Alert, { variant: "destructive", "data-testid": "sealed-preview-error", children: [_jsx(AlertCircle, { strokeWidth: 1.5, className: "h-4 w-4" }), _jsx(AlertDescription, { children: error })] })), running && (_jsx("iframe", { src: preview.frameUrl, sandbox: INTERACTIVE_PREVIEW_SANDBOX, title: "Sealed client code preview", className: "border-border-default h-[60vh] w-full rounded-md border bg-white", "data-testid": "interactive-preview-iframe", onLoad: () => setLoadedFrameKey(preview.frameKey) }, `sealed-preview-${preview.frameKey}`))] }));
37
+ }
38
+ //# sourceMappingURL=SealedClientCodePreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SealedClientCodePreview.js","sourceRoot":"","sources":["../../../src/editor/page-viewer/SealedClientCodePreview.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Navigates the canvas iframe to `url` without adding a browser history entry.
3
+ *
4
+ * Browsers record every iframe navigation after the first as an entry in the
5
+ * page's joint session history. The canvas reloads its frame on version
6
+ * switches, hard refreshes and pre-bridge fallbacks, so driving those loads
7
+ * through the `src` attribute made the browser Back button step back through
8
+ * canvas reloads (re-rendering a stale `edit_rev`) before it ever left the
9
+ * page - and the editor's popstate handler never saw a URL change. Traversing
10
+ * such an entry only navigates the iframe: the top-level URL stays put.
11
+ *
12
+ * `location.replace()` swaps the frame's current entry in place instead, and
13
+ * is callable on cross-origin frames. The first load still goes through `src`:
14
+ * navigating away from the initial about:blank document replaces its entry,
15
+ * and consumers that fall back to reading the attribute keep a meaningful
16
+ * value.
17
+ */
18
+ export declare function navigateCanvasFrame(iframe: HTMLIFrameElement, url: string): void;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Navigates the canvas iframe to `url` without adding a browser history entry.
3
+ *
4
+ * Browsers record every iframe navigation after the first as an entry in the
5
+ * page's joint session history. The canvas reloads its frame on version
6
+ * switches, hard refreshes and pre-bridge fallbacks, so driving those loads
7
+ * through the `src` attribute made the browser Back button step back through
8
+ * canvas reloads (re-rendering a stale `edit_rev`) before it ever left the
9
+ * page - and the editor's popstate handler never saw a URL change. Traversing
10
+ * such an entry only navigates the iframe: the top-level URL stays put.
11
+ *
12
+ * `location.replace()` swaps the frame's current entry in place instead, and
13
+ * is callable on cross-origin frames. The first load still goes through `src`:
14
+ * navigating away from the initial about:blank document replaces its entry,
15
+ * and consumers that fall back to reading the attribute keep a meaningful
16
+ * value.
17
+ */
18
+ export function navigateCanvasFrame(iframe, url) {
19
+ if (!iframe.getAttribute("src")) {
20
+ iframe.src = url;
21
+ return;
22
+ }
23
+ try {
24
+ const frameWindow = iframe.contentWindow;
25
+ if (frameWindow) {
26
+ frameWindow.location.replace(url);
27
+ return;
28
+ }
29
+ }
30
+ catch {
31
+ // A detached or otherwise inaccessible frame window: fall through to the
32
+ // attribute so the canvas still loads, even at the cost of a history entry.
33
+ }
34
+ iframe.src = url;
35
+ }
36
+ //# sourceMappingURL=canvasFrameNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasFrameNavigation.js","sourceRoot":"","sources":["../../../src/editor/page-viewer/canvasFrameNavigation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAyB,EACzB,GAAW;IAEX,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QACjB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC;QACzC,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,4EAA4E;IAC9E,CAAC;IAED,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;AACnB,CAAC"}