@fivepixels-js/react 0.2.10 → 0.2.12

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 (405) hide show
  1. package/README.md +42 -28
  2. package/dist/components/icons/Icons.d.ts +11 -3
  3. package/dist/components/icons/Icons.d.ts.map +1 -1
  4. package/dist/components/icons/Icons.js +19 -3
  5. package/dist/components/icons/Icons.js.map +1 -1
  6. package/dist/components/overlay/DotWaveOverlay.d.ts.map +1 -1
  7. package/dist/components/overlay/DotWaveOverlay.js +1 -3
  8. package/dist/components/overlay/DotWaveOverlay.js.map +1 -1
  9. package/dist/components/overlay/ElementMemoComposer.d.ts +2 -0
  10. package/dist/components/overlay/ElementMemoComposer.d.ts.map +1 -0
  11. package/dist/components/overlay/ElementMemoComposer.js +51 -0
  12. package/dist/components/overlay/ElementMemoComposer.js.map +1 -0
  13. package/dist/components/overlay/PickTargetContextMenu.d.ts +2 -1
  14. package/dist/components/overlay/PickTargetContextMenu.d.ts.map +1 -1
  15. package/dist/components/overlay/PickTargetContextMenu.js +5 -5
  16. package/dist/components/overlay/PickTargetContextMenu.js.map +1 -1
  17. package/dist/components/overlay/PickTargetHoverTooltip.d.ts.map +1 -1
  18. package/dist/components/overlay/PickTargetHoverTooltip.js +1 -1
  19. package/dist/components/overlay/PickTargetHoverTooltip.js.map +1 -1
  20. package/dist/components/overlay/PickTargetSavedBadges.d.ts.map +1 -1
  21. package/dist/components/overlay/PickTargetSavedBadges.js +23 -11
  22. package/dist/components/overlay/PickTargetSavedBadges.js.map +1 -1
  23. package/dist/components/overlay/ReportOverlayLayer.d.ts +1 -1
  24. package/dist/components/overlay/ReportOverlayLayer.d.ts.map +1 -1
  25. package/dist/components/overlay/ReportOverlayLayer.js +13 -3
  26. package/dist/components/overlay/ReportOverlayLayer.js.map +1 -1
  27. package/dist/components/panel/DraftNetworkErrorBanner.d.ts +2 -0
  28. package/dist/components/panel/DraftNetworkErrorBanner.d.ts.map +1 -0
  29. package/dist/components/panel/DraftNetworkErrorBanner.js +13 -0
  30. package/dist/components/panel/DraftNetworkErrorBanner.js.map +1 -0
  31. package/dist/components/panel/FeedbackActivityHeatmap.d.ts.map +1 -1
  32. package/dist/components/panel/FeedbackActivityHeatmap.js +10 -6
  33. package/dist/components/panel/FeedbackActivityHeatmap.js.map +1 -1
  34. package/dist/components/panel/MarkerShapePicker.d.ts +2 -1
  35. package/dist/components/panel/MarkerShapePicker.d.ts.map +1 -1
  36. package/dist/components/panel/MarkerShapePicker.js +9 -4
  37. package/dist/components/panel/MarkerShapePicker.js.map +1 -1
  38. package/dist/components/panel/MarkerSizePreview.d.ts +2 -1
  39. package/dist/components/panel/MarkerSizePreview.d.ts.map +1 -1
  40. package/dist/components/panel/MarkerSizePreview.js +7 -2
  41. package/dist/components/panel/MarkerSizePreview.js.map +1 -1
  42. package/dist/components/panel/PanelGateShell.d.ts +2 -0
  43. package/dist/components/panel/PanelGateShell.d.ts.map +1 -1
  44. package/dist/components/panel/PanelGateShell.js +2 -0
  45. package/dist/components/panel/PanelGateShell.js.map +1 -1
  46. package/dist/components/panel/PanelIntegrationSettings.d.ts +2 -0
  47. package/dist/components/panel/PanelIntegrationSettings.d.ts.map +1 -0
  48. package/dist/components/panel/PanelIntegrationSettings.js +41 -0
  49. package/dist/components/panel/PanelIntegrationSettings.js.map +1 -0
  50. package/dist/components/panel/PanelNetworkFailureBanner.d.ts +2 -0
  51. package/dist/components/panel/PanelNetworkFailureBanner.d.ts.map +1 -0
  52. package/dist/components/panel/PanelNetworkFailureBanner.js +13 -0
  53. package/dist/components/panel/PanelNetworkFailureBanner.js.map +1 -0
  54. package/dist/components/panel/PanelOnboarding.d.ts.map +1 -1
  55. package/dist/components/panel/PanelOnboarding.js +119 -5
  56. package/dist/components/panel/PanelOnboarding.js.map +1 -1
  57. package/dist/components/panel/PanelProjectFooter.d.ts.map +1 -1
  58. package/dist/components/panel/PanelProjectFooter.js +6 -2
  59. package/dist/components/panel/PanelProjectFooter.js.map +1 -1
  60. package/dist/components/panel/PanelSettings.d.ts.map +1 -1
  61. package/dist/components/panel/PanelSettings.js +29 -9
  62. package/dist/components/panel/PanelSettings.js.map +1 -1
  63. package/dist/components/panel/PanelTeamSettings.d.ts.map +1 -1
  64. package/dist/components/panel/PanelTeamSettings.js +5 -1
  65. package/dist/components/panel/PanelTeamSettings.js.map +1 -1
  66. package/dist/components/panel/ReportApiFlowPanel.d.ts +2 -0
  67. package/dist/components/panel/ReportApiFlowPanel.d.ts.map +1 -0
  68. package/dist/components/panel/ReportApiFlowPanel.js +63 -0
  69. package/dist/components/panel/ReportApiFlowPanel.js.map +1 -0
  70. package/dist/components/panel/ReportControlPanel.d.ts.map +1 -1
  71. package/dist/components/panel/ReportControlPanel.js +19 -10
  72. package/dist/components/panel/ReportControlPanel.js.map +1 -1
  73. package/dist/components/panel/ReportDraftForm.d.ts.map +1 -1
  74. package/dist/components/panel/ReportDraftForm.js +29 -5
  75. package/dist/components/panel/ReportDraftForm.js.map +1 -1
  76. package/dist/components/panel/ReportFeedbackList.d.ts.map +1 -1
  77. package/dist/components/panel/ReportFeedbackList.js +17 -7
  78. package/dist/components/panel/ReportFeedbackList.js.map +1 -1
  79. package/dist/components/panel/experimental/ReportMyTasksPanel.d.ts.map +1 -1
  80. package/dist/components/panel/experimental/ReportMyTasksPanel.js +3 -39
  81. package/dist/components/panel/experimental/ReportMyTasksPanel.js.map +1 -1
  82. package/dist/components/panel/feedback/AskAiCopyDropdown.d.ts +20 -0
  83. package/dist/components/panel/feedback/AskAiCopyDropdown.d.ts.map +1 -0
  84. package/dist/components/panel/feedback/AskAiCopyDropdown.js +27 -0
  85. package/dist/components/panel/feedback/AskAiCopyDropdown.js.map +1 -0
  86. package/dist/components/panel/feedback/FeedbackDeleteAction.d.ts +3 -1
  87. package/dist/components/panel/feedback/FeedbackDeleteAction.d.ts.map +1 -1
  88. package/dist/components/panel/feedback/FeedbackDeleteAction.js +7 -3
  89. package/dist/components/panel/feedback/FeedbackDeleteAction.js.map +1 -1
  90. package/dist/components/panel/feedback/FeedbackListItem.d.ts.map +1 -1
  91. package/dist/components/panel/feedback/FeedbackListItem.js +7 -3
  92. package/dist/components/panel/feedback/FeedbackListItem.js.map +1 -1
  93. package/dist/components/panel/feedback/FeedbackThread.d.ts.map +1 -1
  94. package/dist/components/panel/feedback/FeedbackThread.js +20 -4
  95. package/dist/components/panel/feedback/FeedbackThread.js.map +1 -1
  96. package/dist/components/panel/feedback/ThreadAskAiFloatingButton.d.ts +11 -0
  97. package/dist/components/panel/feedback/ThreadAskAiFloatingButton.d.ts.map +1 -0
  98. package/dist/components/panel/feedback/ThreadAskAiFloatingButton.js +27 -0
  99. package/dist/components/panel/feedback/ThreadAskAiFloatingButton.js.map +1 -0
  100. package/dist/components/panel/feedback/ThreadChildReply.d.ts.map +1 -1
  101. package/dist/components/panel/feedback/ThreadChildReply.js +2 -1
  102. package/dist/components/panel/feedback/ThreadChildReply.js.map +1 -1
  103. package/dist/components/panel/feedback/ThreadTimelineRow.d.ts +4 -1
  104. package/dist/components/panel/feedback/ThreadTimelineRow.d.ts.map +1 -1
  105. package/dist/components/panel/feedback/ThreadTimelineRow.js +5 -2
  106. package/dist/components/panel/feedback/ThreadTimelineRow.js.map +1 -1
  107. package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.d.ts +45 -0
  108. package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.d.ts.map +1 -0
  109. package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.js +33 -0
  110. package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.js.map +1 -0
  111. package/dist/components/point/MarkerCaseSidebar.d.ts +4 -1
  112. package/dist/components/point/MarkerCaseSidebar.d.ts.map +1 -1
  113. package/dist/components/point/MarkerCaseSidebar.js +9 -8
  114. package/dist/components/point/MarkerCaseSidebar.js.map +1 -1
  115. package/dist/components/point/MarkerFeedbackWindow.d.ts +2 -1
  116. package/dist/components/point/MarkerFeedbackWindow.d.ts.map +1 -1
  117. package/dist/components/point/MarkerFeedbackWindow.js +412 -58
  118. package/dist/components/point/MarkerFeedbackWindow.js.map +1 -1
  119. package/dist/components/point/MemoMarkersLayer.d.ts +2 -0
  120. package/dist/components/point/MemoMarkersLayer.d.ts.map +1 -0
  121. package/dist/components/point/MemoMarkersLayer.js +60 -0
  122. package/dist/components/point/MemoMarkersLayer.js.map +1 -0
  123. package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -1
  124. package/dist/components/point/ReportMarkersLayer.js +31 -29
  125. package/dist/components/point/ReportMarkersLayer.js.map +1 -1
  126. package/dist/components/point/ReportOpenWindowsLayer.d.ts +2 -0
  127. package/dist/components/point/ReportOpenWindowsLayer.d.ts.map +1 -0
  128. package/dist/components/point/ReportOpenWindowsLayer.js +23 -0
  129. package/dist/components/point/ReportOpenWindowsLayer.js.map +1 -0
  130. package/dist/components/report/FivePixels.d.ts +2 -1
  131. package/dist/components/report/FivePixels.d.ts.map +1 -1
  132. package/dist/components/report/FivePixels.js +2 -3
  133. package/dist/components/report/FivePixels.js.map +1 -1
  134. package/dist/components/report/ReportView.d.ts.map +1 -1
  135. package/dist/components/report/ReportView.js +9 -9
  136. package/dist/components/report/ReportView.js.map +1 -1
  137. package/dist/components/report/index.d.ts +4 -1
  138. package/dist/components/report/index.d.ts.map +1 -1
  139. package/dist/components/report/index.js +2 -0
  140. package/dist/components/report/index.js.map +1 -1
  141. package/dist/components/ui/HoverTooltip.d.ts +2 -1
  142. package/dist/components/ui/HoverTooltip.d.ts.map +1 -1
  143. package/dist/components/ui/HoverTooltip.js +8 -3
  144. package/dist/components/ui/HoverTooltip.js.map +1 -1
  145. package/dist/components/ui/IntegrationLock.d.ts +22 -0
  146. package/dist/components/ui/IntegrationLock.d.ts.map +1 -0
  147. package/dist/components/ui/IntegrationLock.js +31 -0
  148. package/dist/components/ui/IntegrationLock.js.map +1 -0
  149. package/dist/constants/loginMethod.d.ts +5 -0
  150. package/dist/constants/loginMethod.d.ts.map +1 -0
  151. package/dist/constants/loginMethod.js +8 -0
  152. package/dist/constants/loginMethod.js.map +1 -0
  153. package/dist/constants/markerAppearance.d.ts +7 -5
  154. package/dist/constants/markerAppearance.d.ts.map +1 -1
  155. package/dist/constants/markerAppearance.js +8 -5
  156. package/dist/constants/markerAppearance.js.map +1 -1
  157. package/dist/constants/motionClasses.d.ts +2 -9
  158. package/dist/constants/motionClasses.d.ts.map +1 -1
  159. package/dist/constants/motionClasses.js +2 -9
  160. package/dist/constants/motionClasses.js.map +1 -1
  161. package/dist/constants/overlayChrome.d.ts +1 -6
  162. package/dist/constants/overlayChrome.d.ts.map +1 -1
  163. package/dist/constants/overlayChrome.js +1 -6
  164. package/dist/constants/overlayChrome.js.map +1 -1
  165. package/dist/constants/panelTabPresets.js +4 -4
  166. package/dist/constants/panelTabPresets.js.map +1 -1
  167. package/dist/constants/panelTabRegistry.d.ts +2 -2
  168. package/dist/constants/panelTabRegistry.d.ts.map +1 -1
  169. package/dist/constants/panelTabRegistry.js +8 -0
  170. package/dist/constants/panelTabRegistry.js.map +1 -1
  171. package/dist/constants/storageKeys.d.ts +8 -0
  172. package/dist/constants/storageKeys.d.ts.map +1 -1
  173. package/dist/constants/storageKeys.js +16 -0
  174. package/dist/constants/storageKeys.js.map +1 -1
  175. package/dist/hooks/replyHistoryActions.d.ts +2 -2
  176. package/dist/hooks/replyHistoryActions.d.ts.map +1 -1
  177. package/dist/hooks/replyHistoryActions.js +6 -5
  178. package/dist/hooks/replyHistoryActions.js.map +1 -1
  179. package/dist/hooks/report/assembleReportContextValue.d.ts +51 -26
  180. package/dist/hooks/report/assembleReportContextValue.d.ts.map +1 -1
  181. package/dist/hooks/report/assembleReportContextValue.js +78 -11
  182. package/dist/hooks/report/assembleReportContextValue.js.map +1 -1
  183. package/dist/hooks/report/useElementMemos.d.ts +15 -0
  184. package/dist/hooks/report/useElementMemos.d.ts.map +1 -0
  185. package/dist/hooks/report/useElementMemos.js +45 -0
  186. package/dist/hooks/report/useElementMemos.js.map +1 -0
  187. package/dist/hooks/report/useReportAuthSession.d.ts +15 -5
  188. package/dist/hooks/report/useReportAuthSession.d.ts.map +1 -1
  189. package/dist/hooks/report/useReportAuthSession.js +111 -24
  190. package/dist/hooks/report/useReportAuthSession.js.map +1 -1
  191. package/dist/hooks/report/useReportDraftSession.d.ts +11 -1
  192. package/dist/hooks/report/useReportDraftSession.d.ts.map +1 -1
  193. package/dist/hooks/report/useReportDraftSession.js +54 -1
  194. package/dist/hooks/report/useReportDraftSession.js.map +1 -1
  195. package/dist/hooks/report/useReportMarkers.d.ts +6 -7
  196. package/dist/hooks/report/useReportMarkers.d.ts.map +1 -1
  197. package/dist/hooks/report/useReportMarkers.js +73 -49
  198. package/dist/hooks/report/useReportMarkers.js.map +1 -1
  199. package/dist/hooks/report/useReportMutations.d.ts +3 -4
  200. package/dist/hooks/report/useReportMutations.d.ts.map +1 -1
  201. package/dist/hooks/report/useReportMutations.js +3 -5
  202. package/dist/hooks/report/useReportMutations.js.map +1 -1
  203. package/dist/hooks/report/useReportPanelShell.d.ts +25 -37
  204. package/dist/hooks/report/useReportPanelShell.d.ts.map +1 -1
  205. package/dist/hooks/report/useReportPanelShell.js +18 -24
  206. package/dist/hooks/report/useReportPanelShell.js.map +1 -1
  207. package/dist/hooks/report/useReportReplyReview.d.ts +18 -1
  208. package/dist/hooks/report/useReportReplyReview.d.ts.map +1 -1
  209. package/dist/hooks/report/useReportReplyReview.js +282 -6
  210. package/dist/hooks/report/useReportReplyReview.js.map +1 -1
  211. package/dist/hooks/report/useReportState.d.ts +45 -36
  212. package/dist/hooks/report/useReportState.d.ts.map +1 -1
  213. package/dist/hooks/report/useReportState.js +88 -33
  214. package/dist/hooks/report/useReportState.js.map +1 -1
  215. package/dist/hooks/useMarkerAppearancePreference.d.ts +1 -0
  216. package/dist/hooks/useMarkerAppearancePreference.d.ts.map +1 -1
  217. package/dist/hooks/useMarkerAppearancePreference.js +31 -2
  218. package/dist/hooks/useMarkerAppearancePreference.js.map +1 -1
  219. package/dist/hooks/useNetworkMonitor.d.ts +9 -0
  220. package/dist/hooks/useNetworkMonitor.d.ts.map +1 -0
  221. package/dist/hooks/useNetworkMonitor.js +26 -0
  222. package/dist/hooks/useNetworkMonitor.js.map +1 -0
  223. package/dist/hooks/useOverlayChrome.d.ts +2 -5
  224. package/dist/hooks/useOverlayChrome.d.ts.map +1 -1
  225. package/dist/hooks/useOverlayChrome.js +3 -10
  226. package/dist/hooks/useOverlayChrome.js.map +1 -1
  227. package/dist/hooks/usePanelAutoRefresh.d.ts +1 -1
  228. package/dist/hooks/usePanelFeedbackTransfer.js +7 -7
  229. package/dist/hooks/usePanelFeedbackTransfer.js.map +1 -1
  230. package/dist/hooks/useReportPersistence.d.ts +13 -17
  231. package/dist/hooks/useReportPersistence.d.ts.map +1 -1
  232. package/dist/hooks/useReportPersistence.js +18 -13
  233. package/dist/hooks/useReportPersistence.js.map +1 -1
  234. package/dist/i18n/en.d.ts.map +1 -1
  235. package/dist/i18n/en.js +199 -20
  236. package/dist/i18n/en.js.map +1 -1
  237. package/dist/i18n/ko.d.ts.map +1 -1
  238. package/dist/i18n/ko.js +199 -20
  239. package/dist/i18n/ko.js.map +1 -1
  240. package/dist/i18n/types.d.ts +156 -18
  241. package/dist/i18n/types.d.ts.map +1 -1
  242. package/dist/providers/ReportProvider.d.ts +1 -1
  243. package/dist/providers/ReportProvider.d.ts.map +1 -1
  244. package/dist/providers/ReportProvider.js +6 -19
  245. package/dist/providers/ReportProvider.js.map +1 -1
  246. package/dist/providers/reportContext.d.ts +183 -78
  247. package/dist/providers/reportContext.d.ts.map +1 -1
  248. package/dist/providers/reportContextPartitions.d.ts +3 -3
  249. package/dist/providers/reportContextPartitions.d.ts.map +1 -1
  250. package/dist/providers/reportContextPartitions.js +33 -9
  251. package/dist/providers/reportContextPartitions.js.map +1 -1
  252. package/dist/styles/reportStylesheet.d.ts +1 -1
  253. package/dist/styles/reportStylesheet.d.ts.map +1 -1
  254. package/dist/styles/reportStylesheet.js +1 -1
  255. package/dist/styles/reportStylesheet.js.map +1 -1
  256. package/dist/types/adapter.d.ts +66 -0
  257. package/dist/types/adapter.d.ts.map +1 -0
  258. package/dist/types/adapter.js +2 -0
  259. package/dist/types/adapter.js.map +1 -0
  260. package/dist/types/networkMonitor.d.ts +21 -0
  261. package/dist/types/networkMonitor.d.ts.map +1 -0
  262. package/dist/types/networkMonitor.js +2 -0
  263. package/dist/types/networkMonitor.js.map +1 -0
  264. package/dist/types/publicApi.d.ts +17 -5
  265. package/dist/types/publicApi.d.ts.map +1 -1
  266. package/dist/types/report-ui.d.ts +6 -1
  267. package/dist/types/report-ui.d.ts.map +1 -1
  268. package/dist/types/report.d.ts +29 -22
  269. package/dist/types/report.d.ts.map +1 -1
  270. package/dist/utils/adapter/resolveAdapter.d.ts +44 -0
  271. package/dist/utils/adapter/resolveAdapter.d.ts.map +1 -0
  272. package/dist/utils/adapter/resolveAdapter.js +178 -0
  273. package/dist/utils/adapter/resolveAdapter.js.map +1 -0
  274. package/dist/utils/auth/loginSession.d.ts +12 -0
  275. package/dist/utils/auth/loginSession.d.ts.map +1 -0
  276. package/dist/utils/auth/loginSession.js +73 -0
  277. package/dist/utils/auth/loginSession.js.map +1 -0
  278. package/dist/utils/auth/reportAuthError.d.ts +9 -0
  279. package/dist/utils/auth/reportAuthError.d.ts.map +1 -0
  280. package/dist/utils/auth/reportAuthError.js +43 -0
  281. package/dist/utils/auth/reportAuthError.js.map +1 -0
  282. package/dist/utils/auth/resolvePanelView.d.ts +14 -0
  283. package/dist/utils/auth/resolvePanelView.d.ts.map +1 -0
  284. package/dist/utils/auth/resolvePanelView.js +26 -0
  285. package/dist/utils/auth/resolvePanelView.js.map +1 -0
  286. package/dist/utils/feedback/feedbackDataTransfer.d.ts +1 -4
  287. package/dist/utils/feedback/feedbackDataTransfer.d.ts.map +1 -1
  288. package/dist/utils/feedback/feedbackDataTransfer.js +6 -6
  289. package/dist/utils/feedback/feedbackDataTransfer.js.map +1 -1
  290. package/dist/utils/feedback/formatFeedbackForAiPrompt.d.ts +51 -0
  291. package/dist/utils/feedback/formatFeedbackForAiPrompt.d.ts.map +1 -0
  292. package/dist/utils/feedback/formatFeedbackForAiPrompt.js +180 -0
  293. package/dist/utils/feedback/formatFeedbackForAiPrompt.js.map +1 -0
  294. package/dist/utils/feedback/validateFeedbackImport.d.ts.map +1 -1
  295. package/dist/utils/feedback/validateFeedbackImport.js +4 -0
  296. package/dist/utils/feedback/validateFeedbackImport.js.map +1 -1
  297. package/dist/utils/integration/buildAdapterIntegrationStatus.d.ts +29 -0
  298. package/dist/utils/integration/buildAdapterIntegrationStatus.d.ts.map +1 -0
  299. package/dist/utils/integration/buildAdapterIntegrationStatus.js +87 -0
  300. package/dist/utils/integration/buildAdapterIntegrationStatus.js.map +1 -0
  301. package/dist/utils/integration/integrationFeatures.d.ts +32 -0
  302. package/dist/utils/integration/integrationFeatures.d.ts.map +1 -0
  303. package/dist/utils/integration/integrationFeatures.js +101 -0
  304. package/dist/utils/integration/integrationFeatures.js.map +1 -0
  305. package/dist/utils/integration/integrationGate.d.ts +22 -0
  306. package/dist/utils/integration/integrationGate.d.ts.map +1 -0
  307. package/dist/utils/integration/integrationGate.js +11 -0
  308. package/dist/utils/integration/integrationGate.js.map +1 -0
  309. package/dist/utils/marker/coordinates.d.ts +2 -0
  310. package/dist/utils/marker/coordinates.d.ts.map +1 -1
  311. package/dist/utils/marker/coordinates.js +47 -1
  312. package/dist/utils/marker/coordinates.js.map +1 -1
  313. package/dist/utils/marker/markerContext.d.ts.map +1 -1
  314. package/dist/utils/marker/markerContext.js +5 -2
  315. package/dist/utils/marker/markerContext.js.map +1 -1
  316. package/dist/utils/marker/markerShape.d.ts +7 -1
  317. package/dist/utils/marker/markerShape.d.ts.map +1 -1
  318. package/dist/utils/marker/markerShape.js +11 -3
  319. package/dist/utils/marker/markerShape.js.map +1 -1
  320. package/dist/utils/marker/markerTarget.d.ts.map +1 -1
  321. package/dist/utils/marker/markerTarget.js +6 -0
  322. package/dist/utils/marker/markerTarget.js.map +1 -1
  323. package/dist/utils/marker/markerWindowDock.d.ts +17 -0
  324. package/dist/utils/marker/markerWindowDock.d.ts.map +1 -0
  325. package/dist/utils/marker/markerWindowDock.js +40 -0
  326. package/dist/utils/marker/markerWindowDock.js.map +1 -0
  327. package/dist/utils/marker/minimizedWindowAlias.d.ts +3 -0
  328. package/dist/utils/marker/minimizedWindowAlias.d.ts.map +1 -0
  329. package/dist/utils/marker/minimizedWindowAlias.js +50 -0
  330. package/dist/utils/marker/minimizedWindowAlias.js.map +1 -0
  331. package/dist/utils/marker/viewRestore.d.ts +14 -0
  332. package/dist/utils/marker/viewRestore.d.ts.map +1 -0
  333. package/dist/utils/marker/viewRestore.js +88 -0
  334. package/dist/utils/marker/viewRestore.js.map +1 -0
  335. package/dist/utils/memo/elementMemoMarkers.d.ts +17 -0
  336. package/dist/utils/memo/elementMemoMarkers.d.ts.map +1 -0
  337. package/dist/utils/memo/elementMemoMarkers.js +36 -0
  338. package/dist/utils/memo/elementMemoMarkers.js.map +1 -0
  339. package/dist/utils/memo/elementMemos.d.ts +15 -0
  340. package/dist/utils/memo/elementMemos.d.ts.map +1 -0
  341. package/dist/utils/memo/elementMemos.js +97 -0
  342. package/dist/utils/memo/elementMemos.js.map +1 -0
  343. package/dist/utils/network/formatApiFlowEntry.d.ts +11 -0
  344. package/dist/utils/network/formatApiFlowEntry.d.ts.map +1 -0
  345. package/dist/utils/network/formatApiFlowEntry.js +81 -0
  346. package/dist/utils/network/formatApiFlowEntry.js.map +1 -0
  347. package/dist/utils/network/networkMonitor.d.ts +12 -0
  348. package/dist/utils/network/networkMonitor.d.ts.map +1 -0
  349. package/dist/utils/network/networkMonitor.js +334 -0
  350. package/dist/utils/network/networkMonitor.js.map +1 -0
  351. package/dist/utils/network/redactNetworkPayload.d.ts +3 -0
  352. package/dist/utils/network/redactNetworkPayload.d.ts.map +1 -0
  353. package/dist/utils/network/redactNetworkPayload.js +33 -0
  354. package/dist/utils/network/redactNetworkPayload.js.map +1 -0
  355. package/dist/utils/probe/pickProbe.d.ts +1 -0
  356. package/dist/utils/probe/pickProbe.d.ts.map +1 -1
  357. package/dist/utils/probe/pickProbe.js +13 -0
  358. package/dist/utils/probe/pickProbe.js.map +1 -1
  359. package/dist/utils/probe/pickProbeLayout.d.ts +1 -1
  360. package/dist/utils/probe/pickProbeLayout.d.ts.map +1 -1
  361. package/dist/utils/probe/pickProbeLayout.js +3 -3
  362. package/dist/utils/probe/pickProbeLayout.js.map +1 -1
  363. package/dist/utils/probe/pickTargetInspect.d.ts +2 -0
  364. package/dist/utils/probe/pickTargetInspect.d.ts.map +1 -1
  365. package/dist/utils/probe/pickTargetInspect.js +14 -0
  366. package/dist/utils/probe/pickTargetInspect.js.map +1 -1
  367. package/dist/utils/report/buildDraftFromReport.d.ts.map +1 -1
  368. package/dist/utils/report/buildDraftFromReport.js +1 -0
  369. package/dist/utils/report/buildDraftFromReport.js.map +1 -1
  370. package/dist/utils/report/reportPosition.d.ts +1 -0
  371. package/dist/utils/report/reportPosition.d.ts.map +1 -1
  372. package/dist/utils/report/reportPosition.js +9 -0
  373. package/dist/utils/report/reportPosition.js.map +1 -1
  374. package/dist/utils/shared/dom.d.ts.map +1 -1
  375. package/dist/utils/shared/dom.js +5 -1
  376. package/dist/utils/shared/dom.js.map +1 -1
  377. package/dist/utils/shared/storage.d.ts +13 -30
  378. package/dist/utils/shared/storage.d.ts.map +1 -1
  379. package/dist/utils/shared/storage.js +9 -69
  380. package/dist/utils/shared/storage.js.map +1 -1
  381. package/package.json +1 -1
  382. package/dist/components/overlay/FloatingPinRail.d.ts +0 -2
  383. package/dist/components/overlay/FloatingPinRail.d.ts.map +0 -1
  384. package/dist/components/overlay/FloatingPinRail.js +0 -133
  385. package/dist/components/overlay/FloatingPinRail.js.map +0 -1
  386. package/dist/components/panel/feedback/FeedbackPinToggleButton.d.ts +0 -10
  387. package/dist/components/panel/feedback/FeedbackPinToggleButton.d.ts.map +0 -1
  388. package/dist/components/panel/feedback/FeedbackPinToggleButton.js +0 -25
  389. package/dist/components/panel/feedback/FeedbackPinToggleButton.js.map +0 -1
  390. package/dist/hooks/usePinnedFeedbackPreference.d.ts +0 -13
  391. package/dist/hooks/usePinnedFeedbackPreference.d.ts.map +0 -1
  392. package/dist/hooks/usePinnedFeedbackPreference.js +0 -119
  393. package/dist/hooks/usePinnedFeedbackPreference.js.map +0 -1
  394. package/dist/types/pinnedFeedback.d.ts +0 -27
  395. package/dist/types/pinnedFeedback.d.ts.map +0 -1
  396. package/dist/types/pinnedFeedback.js +0 -2
  397. package/dist/types/pinnedFeedback.js.map +0 -1
  398. package/dist/utils/overlay/edgeDock.d.ts +0 -47
  399. package/dist/utils/overlay/edgeDock.d.ts.map +0 -1
  400. package/dist/utils/overlay/edgeDock.js +0 -144
  401. package/dist/utils/overlay/edgeDock.js.map +0 -1
  402. package/dist/utils/pinned/pinnedFeedback.d.ts +0 -18
  403. package/dist/utils/pinned/pinnedFeedback.d.ts.map +0 -1
  404. package/dist/utils/pinned/pinnedFeedback.js +0 -89
  405. package/dist/utils/pinned/pinnedFeedback.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState, Fragment } from "react";
3
3
  import { getMarkerDotSize } from "../../utils/marker/markerRuntime.js";
4
4
  import { useDraggableWindow, clampWindowPosition } from "../../hooks/useDraggableWindow.js";
@@ -6,18 +6,20 @@ import { useGhostCornerResize } from "../../hooks/useGhostCornerResize.js";
6
6
  import { useNativeHover } from "../../hooks/useNativeHover.js";
7
7
  import { useReport } from "../../providers/reportContext.js";
8
8
  import { resolvePendingComposerTargetPreview, shouldShowCaseReplyComposer } from "../../utils/feedback/feedbackThread.js";
9
- import { getCaseAssigneeName, getCaseById } from "../../utils/report/reportCases.js";
9
+ import { getCaseAssigneeName, getCaseById, getReportCases } from "../../utils/report/reportCases.js";
10
10
  import { getFieldTags } from "../../utils/report/fields.js";
11
11
  import { copyTextToClipboard } from "../../utils/feedback/feedbackDataTransfer.js";
12
+ import { buildAiPromptLabels, formatFeedbackForAiPrompt } from "../../utils/feedback/formatFeedbackForAiPrompt.js";
12
13
  import { buildFeedbackShareUrl } from "../../utils/feedback/feedbackDeepLink.js";
13
- import { CloseIcon, CheckCircleIcon, EditIcon, LinkIcon, MaximizeIcon, MinimizeIcon, RestoreIcon, SidePanelIcon } from "../../components/icons/Icons.js";
14
+ import { AskAiCopyDropdown } from "../../components/panel/feedback/AskAiCopyDropdown.js";
15
+ import { CloseIcon, CheckCircleIcon, ChevronDownIcon, EditIcon, LinkIcon, MaximizeIcon, MinimizeIcon, RestoreIcon, SidePanelIcon, TrashIcon, AskAiIcon } from "../../components/icons/Icons.js";
14
16
  import { FeedbackFieldTags } from "../../components/panel/feedback/FeedbackFieldTags.js";
15
- import { FeedbackPinToggleButton } from "../../components/panel/feedback/FeedbackPinToggleButton.js";
16
17
  import { FeedbackDeleteAction } from "../../components/panel/feedback/FeedbackDeleteAction.js";
17
18
  import { canDeleteFeedback } from "../../utils/feedback/feedbackPermissions.js";
18
19
  import { canEditReportCases } from "../../utils/report/reportCases.js";
19
20
  import { mentionMessageToPlainText } from "../../utils/mention/elementMentions.js";
20
21
  import { HoverTooltip } from "../../components/ui/HoverTooltip.js";
22
+ import { useIntegrationLock } from "../../components/ui/IntegrationLock.js";
21
23
  import { CornerResizeGhost } from "../../components/ui/CornerResizeGhost.js";
22
24
  import { MOTION } from "../../constants/motionClasses.js";
23
25
  import { ACCENT_COLOR } from "../../constants/accentColors.js";
@@ -28,7 +30,9 @@ import { FeedbackThread } from "../../components/panel/feedback/FeedbackThread.j
28
30
  import { MarkerCaseSidebar } from "./MarkerCaseSidebar.js";
29
31
  import { ProcessingDots } from "../../components/ui/ProcessingDots.js";
30
32
  import { Text } from "../../components/ui/Text/index.js";
31
- const WINDOW_MARGIN = 16;
33
+ import { MARKER_MINIMIZED_WINDOW_HEIGHT, MARKER_MINIMIZED_WINDOW_WIDTH, MARKER_WINDOW_MARGIN, resolveMinimizedDockIndexFromPointer, resolveMinimizedDockPosition } from "../../utils/marker/markerWindowDock.js";
34
+ import { readMinimizedWindowAlias, writeMinimizedWindowAlias } from "../../utils/marker/minimizedWindowAlias.js";
35
+ const WINDOW_MARGIN = MARKER_WINDOW_MARGIN;
32
36
  const DEFAULT_WINDOW_SIZE = { width: 600, height: 460 };
33
37
  const MIN_WINDOW_WIDTH = 420;
34
38
  const MIN_WINDOW_HEIGHT = 280;
@@ -37,6 +41,14 @@ const RESOLVED_STATUS_COLOR = ACCENT_COLOR.green;
37
41
  const SIDEBAR_MIN_WIDTH = 150;
38
42
  const RIGHT_MIN_WIDTH = 280;
39
43
  const COLLAPSED_SIDEBAR_WIDTH = 46;
44
+ const MINIMIZED_WINDOW_HEIGHT = MARKER_MINIMIZED_WINDOW_HEIGHT;
45
+ const MINIMIZED_WINDOW_WIDTH = MARKER_MINIMIZED_WINDOW_WIDTH;
46
+ const MINIMIZE_MORPH_MS = 420;
47
+ const MINIMIZE_MORPH_EASE = "cubic-bezier(0.22, 1, 0.36, 1)";
48
+ const MINIMIZE_MORPH_TRANSITION = `left ${MINIMIZE_MORPH_MS}ms ${MINIMIZE_MORPH_EASE}, top ${MINIMIZE_MORPH_MS}ms ${MINIMIZE_MORPH_EASE}, width ${MINIMIZE_MORPH_MS}ms ${MINIMIZE_MORPH_EASE}, height ${MINIMIZE_MORPH_MS}ms ${MINIMIZE_MORPH_EASE}`;
49
+ const MINIMIZED_DOCK_SLIDE_TRANSITION = `left ${MINIMIZE_MORPH_MS}ms ${MINIMIZE_MORPH_EASE}, top ${MINIMIZE_MORPH_MS}ms ${MINIMIZE_MORPH_EASE}`;
50
+ const MINIMIZED_DOCK_DRAG_THRESHOLD_PX = 6;
51
+ const MINIMIZED_DOCK_DRAG_LIFT_PX = 10;
40
52
  const WINDOW_CLOSE_ANIMATION_MS = 220;
41
53
  const LEFT_SECTION_TRANSITION = "transition-[background-color,backdrop-filter] duration-200 ease-[cubic-bezier(0.22,1,0.36,1)]";
42
54
  const LEFT_SECTION_FLAT_CLASS = `${LEFT_SECTION_TRANSITION} bg-[var(--adaptive-black50)]`;
@@ -45,6 +57,10 @@ function getLeftSectionClass(phase) {
45
57
  return phase === "idle" ? LEFT_SECTION_BLUR_CLASS : LEFT_SECTION_FLAT_CLASS;
46
58
  }
47
59
  const HEADER_BUTTON_CLASS = "flex h-[24px] w-[24px] items-center justify-center rounded-[6px] text-[var(--adaptive-black600)] transition-colors hover:bg-[var(--adaptive-tintOpacity200)] hover:text-[var(--adaptive-black900)]";
60
+ const SIDEBAR_ACTION_CLASS = "flex h-[32px] w-full items-center gap-[8px] rounded-[8px] px-[8px] text-left text-[13px] font-semibold text-[var(--adaptive-black700)] transition-colors hover:bg-[var(--adaptive-tintOpacity200)] hover:text-[var(--adaptive-black900)]";
61
+ function prefersReducedMotion() {
62
+ return typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
63
+ }
48
64
  function getViewportSize() {
49
65
  if (typeof window === "undefined") {
50
66
  return { width: DEFAULT_WINDOW_SIZE.width, height: DEFAULT_WINDOW_SIZE.height };
@@ -67,7 +83,62 @@ function clampSidebarWidth(width, windowWidth) {
67
83
  function WindowControlButton({ onClick, ariaLabel, title, className = "", children }) {
68
84
  return (_jsx("button", { type: "button", "data-fivepixels-interactive": "", onPointerDown: (event) => event.stopPropagation(), onClick: onClick, "aria-label": ariaLabel, title: title, className: `${HEADER_BUTTON_CLASS} ${className}`, children: children }));
69
85
  }
70
- function MarkerWindowShareButton({ report, messages }) {
86
+ function MinimizedCaseMarquee({ caseTexts }) {
87
+ if (caseTexts.length === 0) {
88
+ return null;
89
+ }
90
+ return (_jsx("div", { className: "min-w-0 flex-1 overflow-hidden text-[12px] text-[var(--adaptive-black700)]", children: _jsx("div", { "aria-hidden": true, className: "fivepixels-marker-window-marquee", style: { animationDuration: `${Math.max(12, caseTexts.length * 6)}s` }, children: [0, 1].map((copyIndex) => (_jsx("div", { className: "fivepixels-marker-window-marquee__copy", children: caseTexts.map((text, index) => (_jsxs("span", { className: "whitespace-nowrap", children: [_jsxs("span", { className: "mr-[4px] text-[var(--adaptive-black500)]", children: [index + 1, "."] }), text] }, `${copyIndex}-${index}`))) }, copyIndex))) }) }));
91
+ }
92
+ function MinimizedWindowAliasRow({ projectId, reportId, caseTexts, messages, onRestore, restoreDisabled = false, }) {
93
+ const [alias, setAlias] = useState(() => readMinimizedWindowAlias(projectId, reportId));
94
+ const [isEditing, setIsEditing] = useState(false);
95
+ const [draft, setDraft] = useState(alias);
96
+ const inputRef = useRef(null);
97
+ useEffect(() => {
98
+ setAlias(readMinimizedWindowAlias(projectId, reportId));
99
+ }, [projectId, reportId]);
100
+ useEffect(() => {
101
+ if (!isEditing) {
102
+ return;
103
+ }
104
+ inputRef.current?.focus();
105
+ inputRef.current?.select();
106
+ }, [isEditing]);
107
+ const commitAlias = () => {
108
+ const next = writeMinimizedWindowAlias(projectId, reportId, draft);
109
+ setAlias(next);
110
+ setDraft(next);
111
+ setIsEditing(false);
112
+ };
113
+ const clearAlias = () => {
114
+ writeMinimizedWindowAlias(projectId, reportId, "");
115
+ setAlias("");
116
+ setDraft("");
117
+ setIsEditing(false);
118
+ };
119
+ if (isEditing) {
120
+ return (_jsxs("div", { className: "flex min-w-0 items-center gap-[4px]", onPointerDown: (event) => event.stopPropagation(), onClick: (event) => event.stopPropagation(), children: [_jsx("input", { ref: inputRef, type: "text", value: draft, maxLength: 40, placeholder: messages.marker.minimizedAliasPlaceholder, "aria-label": messages.marker.minimizedAliasInputAriaLabel, "data-fivepixels-interactive": "", onChange: (event) => setDraft(event.target.value), onKeyDown: (event) => {
121
+ if (event.key === "Enter") {
122
+ event.preventDefault();
123
+ commitAlias();
124
+ }
125
+ if (event.key === "Escape") {
126
+ event.preventDefault();
127
+ setDraft(alias);
128
+ setIsEditing(false);
129
+ }
130
+ }, onBlur: commitAlias, className: "min-w-0 flex-1 rounded-[4px] border border-[var(--adaptive-border-subtle)] bg-[var(--adaptive-black100)] px-[6px] py-[2px] text-[12px] font-semibold text-[var(--adaptive-black900)] outline-none focus:border-[var(--adaptive-blue500)]" }), alias ? (_jsx("button", { type: "button", "data-fivepixels-interactive": "", "aria-label": messages.marker.minimizedAliasClearAriaLabel, title: messages.marker.minimizedAliasClearAriaLabel, onMouseDown: (event) => event.preventDefault(), onClick: clearAlias, className: "inline-flex h-[20px] w-[20px] shrink-0 items-center justify-center rounded-[4px] text-[var(--adaptive-black500)] hover:bg-[var(--adaptive-tintOpacity200)] hover:text-[var(--adaptive-black900)]", children: _jsx(CloseIcon, { className: "h-[12px] w-[12px]" }) })) : null] }));
131
+ }
132
+ return (_jsxs("div", { className: "flex min-w-0 items-center gap-[4px]", children: [_jsx("button", { type: "button", "data-fivepixels-interactive": "", onClick: onRestore, disabled: restoreDisabled, "aria-label": messages.marker.windowRestoreAriaLabel, className: "flex min-w-0 flex-1 items-center overflow-hidden text-left", children: alias ? (_jsx("p", { className: "min-w-0 flex-1 truncate text-[12px] font-semibold leading-[1.3] text-[var(--adaptive-black900)]", title: alias, children: alias })) : (_jsx(MinimizedCaseMarquee, { caseTexts: caseTexts })) }), _jsx("button", { type: "button", "data-fivepixels-interactive": "", "aria-label": messages.marker.minimizedAliasEditAriaLabel, title: messages.marker.minimizedAliasEditAriaLabel, onPointerDown: (event) => event.stopPropagation(), onClick: (event) => {
133
+ event.stopPropagation();
134
+ setDraft(alias);
135
+ setIsEditing(true);
136
+ }, className: "inline-flex h-[20px] w-[20px] shrink-0 items-center justify-center rounded-[4px] text-[var(--adaptive-black500)] hover:bg-[var(--adaptive-tintOpacity200)] hover:text-[var(--adaptive-black900)]", children: _jsx(EditIcon, { className: "h-[12px] w-[12px]" }) })] }));
137
+ }
138
+ function UnfocusedCaseSummary({ caseTexts, emptyLabel, navigateHint }) {
139
+ return (_jsxs("div", { className: "flex max-h-full w-full max-w-[440px] flex-col items-center gap-[12px] overflow-hidden px-[28px]", children: [navigateHint ? _jsx("p", { className: "text-center text-[12px] font-medium leading-[1.4] text-[var(--adaptive-blue500)]", children: navigateHint }) : null, caseTexts.length === 0 ? (_jsx("p", { className: "text-center text-[13px] text-[var(--adaptive-black500)]", children: emptyLabel })) : (_jsx("ul", { className: "flex w-full flex-col gap-[8px] overflow-hidden", children: caseTexts.map((text, index) => (_jsxs("li", { className: "truncate text-center text-[13px] leading-[1.4] text-[var(--adaptive-black800)]", title: text, children: [_jsxs("span", { className: "mr-[6px] text-[var(--adaptive-black500)]", children: [index + 1, "."] }), text] }, `${index}-${text.slice(0, 24)}`))) }))] }));
140
+ }
141
+ function MarkerWindowShareButton({ report, messages, expanded = false }) {
71
142
  const [copied, setCopied] = useState(false);
72
143
  const handleCopy = () => {
73
144
  void copyTextToClipboard(buildFeedbackShareUrl(report))
@@ -79,10 +150,38 @@ function MarkerWindowShareButton({ report, messages }) {
79
150
  setCopied(false);
80
151
  });
81
152
  };
82
- return (_jsx(WindowControlButton, { onClick: handleCopy, ariaLabel: messages.marker.shareLinkAriaLabel, title: copied ? messages.marker.shareLinkCopiedTitle : messages.marker.shareLinkTitle, children: _jsx(LinkIcon, { className: "h-[15px] w-[15px]" }) }));
153
+ return expanded ? (_jsxs("button", { type: "button", "data-fivepixels-interactive": "", onPointerDown: (event) => event.stopPropagation(), onClick: handleCopy, "aria-label": messages.marker.shareLinkAriaLabel, className: SIDEBAR_ACTION_CLASS, children: [_jsx(LinkIcon, { className: "h-[15px] w-[15px] shrink-0" }), _jsx("span", { children: copied ? messages.marker.shareLinkCopiedTitle : messages.marker.shareAction })] })) : (_jsx(WindowControlButton, { onClick: handleCopy, ariaLabel: messages.marker.shareLinkAriaLabel, title: copied ? messages.marker.shareLinkCopiedTitle : messages.marker.shareLinkTitle, children: _jsx(LinkIcon, { className: "h-[15px] w-[15px]" }) }));
83
154
  }
84
- export function MarkerFeedbackWindow({ report, anchor }) {
85
- const { messages, fields, authors, pendingComposer, replyDraft, replyMentions, replyAuthorName, confirmAuthorName, showConfirmAuthorSelect, errorMessage, setErrorMessage, isUpdating, isSubmittingReply, isClaimingAssignee, focusedCaseId, selectCase, closeReplyComposer, clearHoverLeaveTimeout, scheduleHoverLeave, setHoveredMarkerId, setReplyDraft, setReplyMentions, setReplyAuthorName, setConfirmAuthorName, toggleConfirmAuthorSelect, handleReplySubmit, startDenyReview, startCheckoutReview, startAskQuestion, handleClaimAssignee, handleTransferAssignee, handleConfirmResolution, handleDelete, isDeleting, sessionActor, cancelPendingComposer, beginFeedbackEdit, } = useReport();
155
+ function MarkerWindowAskAiButton({ report, fields, messages, focusedCaseId, expanded = false, }) {
156
+ const copyPrompt = (options) => {
157
+ const text = formatFeedbackForAiPrompt(report, fields, options, buildAiPromptLabels(messages));
158
+ if (!text) {
159
+ return Promise.reject(new Error("empty prompt"));
160
+ }
161
+ return copyTextToClipboard(text);
162
+ };
163
+ return (_jsx(AskAiCopyDropdown, { menuClassName: "min-w-[168px]", align: "right", items: [
164
+ {
165
+ id: "full-review",
166
+ label: messages.marker.askAi.fullReview,
167
+ onSelect: () => copyPrompt({ intent: "review", scope: "full" }),
168
+ },
169
+ {
170
+ id: "full-modification",
171
+ label: messages.marker.askAi.fullModification,
172
+ onSelect: () => copyPrompt({ intent: "modification", scope: "full" }),
173
+ },
174
+ {
175
+ id: "selected-case-review",
176
+ label: messages.marker.askAi.selectedCaseReview,
177
+ disabled: !focusedCaseId,
178
+ onSelect: () => copyPrompt({ intent: "review", scope: "selectedCase", caseId: focusedCaseId ?? undefined }),
179
+ },
180
+ ], trigger: ({ open, copied, toggle }) => expanded ? (_jsxs("button", { type: "button", "data-fivepixels-interactive": "", onPointerDown: (event) => event.stopPropagation(), onClick: toggle, "aria-expanded": open, "aria-haspopup": "menu", "aria-label": messages.marker.askAi.menuAriaLabel, className: SIDEBAR_ACTION_CLASS, children: [_jsx(AskAiIcon, { className: "h-[15px] w-[15px] shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: copied ? messages.marker.askAi.copied : messages.marker.askAi.title }), _jsx(ChevronDownIcon, { className: `h-[14px] w-[14px] shrink-0 transition-transform ${open ? "rotate-180" : ""}` })] })) : (_jsx(WindowControlButton, { onClick: toggle, ariaLabel: messages.marker.askAi.ariaLabel, title: copied ? messages.marker.askAi.copied : messages.marker.askAi.title, className: open ? "text-[var(--adaptive-blue500)]" : "", children: _jsx(AskAiIcon, { className: "h-[15px] w-[15px]" }) })) }));
181
+ }
182
+ export function MarkerFeedbackWindow({ report, anchor, isFocused }) {
183
+ const { messages, fields, authors, currentPathname, pendingComposer, replyDraft, replyMentions, replyAuthorName, confirmAuthorName, showConfirmAuthorSelect, errorMessage, setErrorMessage, isUpdating, isSubmittingReply, isClaimingAssignee, focusedCaseId, selectCase, closeReplyWindow, focusReplyWindow, revealOpenFeedback, minimizedReplyReportIds, setReplyWindowMinimized, reorderMinimizedReplyWindow, clearHoverLeaveTimeout, scheduleHoverLeave, setHoveredMarkerId, setReplyDraft, setReplyMentions, setReplyAuthorName, setConfirmAuthorName, toggleConfirmAuthorSelect, handleReplySubmit, startDenyReview, startCheckoutReview, startAskQuestion, handleClaimAssignee, handleTransferAssignee, handleConfirmResolution, handleDelete, isDeleting, sessionActor, cancelPendingComposer, beginFeedbackEdit, beginComposeNewCase, isComposingNewCase, projectId, } = useReport();
184
+ const deleteLock = useIntegrationLock("deleteFeedback");
86
185
  const windowRef = useRef(null);
87
186
  const surfaceRef = useRef(null);
88
187
  const closeRequestedRef = useRef(false);
@@ -92,6 +191,16 @@ export function MarkerFeedbackWindow({ report, anchor }) {
92
191
  const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false);
93
192
  const [size, setSize] = useState(DEFAULT_WINDOW_SIZE);
94
193
  const [sidebarWidth, setSidebarWidth] = useState(DEFAULT_SIDEBAR_WIDTH);
194
+ const [isSidebarDeleteConfirming, setIsSidebarDeleteConfirming] = useState(false);
195
+ const [dockMorph, setDockMorph] = useState(null);
196
+ const [dockDrag, setDockDrag] = useState(null);
197
+ const dockMorphTimerRef = useRef(null);
198
+ const dockMorphFrameRef = useRef(null);
199
+ const dockDragRef = useRef(null);
200
+ const dockDragListenersRef = useRef(null);
201
+ const suppressDockRestoreClickRef = useRef(false);
202
+ const minimizedReplyReportIdsRef = useRef(minimizedReplyReportIds);
203
+ minimizedReplyReportIdsRef.current = minimizedReplyReportIds;
95
204
  const splitStateRef = useRef(null);
96
205
  const splitListenersRef = useRef(null);
97
206
  const hoverRef = useNativeHover({
@@ -108,11 +217,11 @@ export function MarkerFeedbackWindow({ report, anchor }) {
108
217
  hoverRef(node);
109
218
  }, [hoverRef]);
110
219
  const { position, handleDragHandlePointerDown } = useDraggableWindow({
111
- enabled: windowMode !== "maximized",
220
+ enabled: windowMode === "normal" && dockMorph === null,
112
221
  windowRef,
113
222
  });
114
223
  const { isResizing, ghostRef, handleResizePointerDown } = useGhostCornerResize({
115
- enabled: windowMode === "normal",
224
+ enabled: windowMode === "normal" && dockMorph === null,
116
225
  targetRef: surfaceRef,
117
226
  handleCorner: "bottom-right",
118
227
  clampSize: clampMarkerWindowSize,
@@ -124,9 +233,9 @@ export function MarkerFeedbackWindow({ report, anchor }) {
124
233
  }
125
234
  closeFinishedRef.current = true;
126
235
  clearHoverLeaveTimeout();
127
- setHoveredMarkerId(null);
128
- closeReplyComposer();
129
- }, [clearHoverLeaveTimeout, closeReplyComposer, setHoveredMarkerId]);
236
+ setHoveredMarkerId((current) => (current === report.id ? null : current));
237
+ closeReplyWindow(report.id);
238
+ }, [clearHoverLeaveTimeout, closeReplyWindow, report.id, setHoveredMarkerId]);
130
239
  const requestClose = useCallback(() => {
131
240
  if (closeRequestedRef.current) {
132
241
  return;
@@ -155,29 +264,6 @@ export function MarkerFeedbackWindow({ report, anchor }) {
155
264
  window.clearTimeout(fallbackId);
156
265
  };
157
266
  }, [finishClose, windowSurfacePhase]);
158
- useEffect(() => {
159
- if (!focusedCaseId) {
160
- return;
161
- }
162
- const handlePointerDown = (event) => {
163
- if (closeRequestedRef.current) {
164
- return;
165
- }
166
- const path = event.composedPath();
167
- if (windowRef.current && path.includes(windowRef.current)) {
168
- return;
169
- }
170
- const clickedMarker = path.find((node) => node instanceof Element && node.hasAttribute("data-marker-report-id"));
171
- if (clickedMarker instanceof Element) {
172
- return;
173
- }
174
- requestClose();
175
- };
176
- window.addEventListener("pointerdown", handlePointerDown);
177
- return () => {
178
- window.removeEventListener("pointerdown", handlePointerDown);
179
- };
180
- }, [focusedCaseId, requestClose]);
181
267
  const detachSplitListeners = useCallback(() => {
182
268
  const listeners = splitListenersRef.current;
183
269
  if (!listeners) {
@@ -189,36 +275,123 @@ export function MarkerFeedbackWindow({ report, anchor }) {
189
275
  splitListenersRef.current = null;
190
276
  }, []);
191
277
  useEffect(() => () => detachSplitListeners(), [detachSplitListeners]);
278
+ const clearDockMorphTimers = useCallback(() => {
279
+ if (dockMorphTimerRef.current !== null) {
280
+ window.clearTimeout(dockMorphTimerRef.current);
281
+ dockMorphTimerRef.current = null;
282
+ }
283
+ if (dockMorphFrameRef.current !== null) {
284
+ window.cancelAnimationFrame(dockMorphFrameRef.current);
285
+ dockMorphFrameRef.current = null;
286
+ }
287
+ }, []);
288
+ const detachDockDragListeners = useCallback(() => {
289
+ const listeners = dockDragListenersRef.current;
290
+ if (!listeners) {
291
+ return;
292
+ }
293
+ window.removeEventListener("pointermove", listeners.move, true);
294
+ window.removeEventListener("pointerup", listeners.up, true);
295
+ window.removeEventListener("pointercancel", listeners.up, true);
296
+ dockDragListenersRef.current = null;
297
+ }, []);
298
+ useEffect(() => () => clearDockMorphTimers(), [clearDockMorphTimers]);
299
+ useEffect(() => () => detachDockDragListeners(), [detachDockDragListeners]);
300
+ useEffect(() => {
301
+ if (!isSidebarDeleteConfirming) {
302
+ return;
303
+ }
304
+ const timer = window.setTimeout(() => setIsSidebarDeleteConfirming(false), 1500);
305
+ return () => window.clearTimeout(timer);
306
+ }, [isSidebarDeleteConfirming]);
307
+ useEffect(() => {
308
+ const dockMinimized = minimizedReplyReportIds.includes(report.id);
309
+ if (!dockMinimized && windowMode === "minimized" && dockMorph === null) {
310
+ setWindowMode("normal");
311
+ }
312
+ }, [dockMorph, minimizedReplyReportIds, report.id, windowMode]);
313
+ const isOnFeedbackPath = report.pathname === currentPathname;
314
+ const showFullContent = isFocused && isOnFeedbackPath;
315
+ const isComposingCaseInThisWindow = showFullContent && isComposingNewCase;
192
316
  const isCreatorQuestionComposer = pendingComposer?.type === "question";
193
317
  const showComposer = useMemo(() => {
318
+ if (!showFullContent) {
319
+ return false;
320
+ }
321
+ if (isComposingNewCase) {
322
+ return true;
323
+ }
194
324
  if (!focusedCaseId) {
195
325
  return false;
196
326
  }
197
327
  return shouldShowCaseReplyComposer(report, focusedCaseId, pendingComposer);
198
- }, [focusedCaseId, pendingComposer, report]);
328
+ }, [focusedCaseId, isComposingNewCase, pendingComposer, report, showFullContent]);
199
329
  const replyTargetPreview = useMemo(() => {
200
- if (pendingComposer?.type !== "question") {
330
+ if (!showFullContent || isComposingNewCase || pendingComposer?.type !== "question") {
201
331
  return null;
202
332
  }
203
333
  return resolvePendingComposerTargetPreview(report, focusedCaseId, pendingComposer);
204
- }, [focusedCaseId, pendingComposer, report]);
205
- const focusedCase = focusedCaseId ? getCaseById(report, focusedCaseId) : undefined;
206
- const focusedCaseAssigneeName = focusedCaseId ? getCaseAssigneeName(report, focusedCaseId) : null;
334
+ }, [focusedCaseId, isComposingNewCase, pendingComposer, report, showFullContent]);
335
+ const focusedCase = showFullContent && !isComposingNewCase && focusedCaseId ? getCaseById(report, focusedCaseId) : undefined;
336
+ const focusedCaseAssigneeName = showFullContent && !isComposingNewCase && focusedCaseId ? getCaseAssigneeName(report, focusedCaseId) : null;
207
337
  const showAssigneeAssigned = Boolean(focusedCaseAssigneeName) || isClaimingAssignee;
208
338
  const fieldTags = useMemo(() => getFieldTags(fields, report.field_values), [fields, report.field_values]);
339
+ const caseTexts = useMemo(() => getReportCases(report)
340
+ .map((caseItem) => mentionMessageToPlainText(caseItem.text, caseItem.mentions).trim())
341
+ .filter(Boolean), [report]);
342
+ const minimizedCaseTexts = useMemo(() => caseTexts.slice(0, 5), [caseTexts]);
209
343
  const viewport = getViewportSize();
210
344
  const maximizedSize = {
211
345
  width: Math.max(MIN_WINDOW_WIDTH, viewport.width - WINDOW_MARGIN * 2),
212
346
  height: Math.max(MIN_WINDOW_HEIGHT, viewport.height - WINDOW_MARGIN * 2),
213
347
  };
214
- const isMinimized = windowMode === "minimized";
348
+ const isMinimized = windowMode === "minimized" || dockMorph?.phase === "minimizing";
215
349
  const isMaximized = windowMode === "maximized";
350
+ const showMinimizedChrome = windowMode === "minimized" && dockMorph?.phase !== "restoring";
216
351
  const effectiveSize = isMaximized ? maximizedSize : size;
352
+ const minimizedWidth = Math.min(MINIMIZED_WINDOW_WIDTH, Math.max(0, viewport.width - WINDOW_MARGIN * 2));
217
353
  const resolvedSidebarWidth = clampSidebarWidth(sidebarWidth, effectiveSize.width);
218
- const initialPosition = useMemo(() => clampWindowPosition(anchor.left + getMarkerDotSize() / 2 - size.width / 2, anchor.top + getMarkerDotSize() / 2 - size.height / 2, size.width, size.height), [anchor.left, anchor.top, size.height, size.width]);
219
- const resolvedPosition = isMaximized ? { left: WINDOW_MARGIN, top: WINDOW_MARGIN } : (position ?? initialPosition);
354
+ const minimizedDockIndex = Math.max(0, minimizedReplyReportIds.indexOf(report.id));
355
+ const minimizedDockCount = Math.max(1, minimizedReplyReportIds.length);
356
+ // Freeze the open position on mount so page changes (lost marker anchors) don't
357
+ // collapse every window onto the same fallback center coordinate.
358
+ const [seedPosition] = useState(() => clampWindowPosition(anchor.left + getMarkerDotSize() / 2 - DEFAULT_WINDOW_SIZE.width / 2, anchor.top + getMarkerDotSize() / 2 - DEFAULT_WINDOW_SIZE.height / 2, DEFAULT_WINDOW_SIZE.width, DEFAULT_WINDOW_SIZE.height));
359
+ const restoredPosition = isMaximized ? { left: WINDOW_MARGIN, top: WINDOW_MARGIN } : (position ?? seedPosition);
360
+ const dockPosition = resolveMinimizedDockPosition(minimizedDockIndex, minimizedDockCount, viewport.width, viewport.height, minimizedWidth, MINIMIZED_WINDOW_HEIGHT);
361
+ const resolvedPosition = showMinimizedChrome ? dockPosition : restoredPosition;
362
+ const isDockDragging = dockDrag?.active === true;
363
+ const displayRect = dockMorph ?? {
364
+ left: dockDrag?.active ? dockDrag.pointerX - dockDrag.offsetX : resolvedPosition.left,
365
+ top: dockDrag?.active ? dockPosition.top - MINIMIZED_DOCK_DRAG_LIFT_PX : resolvedPosition.top,
366
+ width: showMinimizedChrome ? minimizedWidth : effectiveSize.width,
367
+ height: showMinimizedChrome ? MINIMIZED_WINDOW_HEIGHT : effectiveSize.height,
368
+ };
369
+ const layoutTransition = dockMorph
370
+ ? MINIMIZE_MORPH_TRANSITION
371
+ : showMinimizedChrome && !isDockDragging
372
+ ? MINIMIZED_DOCK_SLIDE_TRANSITION
373
+ : undefined;
220
374
  const leftSectionClass = getLeftSectionClass(windowSurfacePhase);
221
375
  const windowAnimationClass = windowSurfacePhase === "exiting" ? MOTION.markerWindowExit : windowSurfacePhase === "entering" ? `${MOTION.markerWindowEnter} pointer-events-auto` : "pointer-events-auto";
376
+ const runDockMorph = useCallback((phase, from, to, onComplete) => {
377
+ clearDockMorphTimers();
378
+ if (prefersReducedMotion()) {
379
+ setDockMorph(null);
380
+ onComplete?.();
381
+ return;
382
+ }
383
+ setDockMorph({ phase, ...from });
384
+ dockMorphFrameRef.current = window.requestAnimationFrame(() => {
385
+ dockMorphFrameRef.current = window.requestAnimationFrame(() => {
386
+ setDockMorph({ phase, ...to });
387
+ dockMorphTimerRef.current = window.setTimeout(() => {
388
+ setDockMorph(null);
389
+ onComplete?.();
390
+ dockMorphTimerRef.current = null;
391
+ }, MINIMIZE_MORPH_MS + 40);
392
+ });
393
+ });
394
+ }, [clearDockMorphTimers]);
222
395
  const handleSplitPointerDown = useCallback((event) => {
223
396
  if (event.button !== 0) {
224
397
  return;
@@ -245,32 +418,213 @@ export function MarkerFeedbackWindow({ report, anchor }) {
245
418
  window.addEventListener("pointercancel", handlePointerUp, true);
246
419
  }, [detachSplitListeners, effectiveSize.width, resolvedSidebarWidth]);
247
420
  const handleToggleMinimize = () => {
248
- setWindowMode((current) => (current === "minimized" ? "normal" : "minimized"));
421
+ if (dockMorph) {
422
+ return;
423
+ }
424
+ const viewportSize = getViewportSize();
425
+ const currentMinimizedWidth = Math.min(MINIMIZED_WINDOW_WIDTH, Math.max(0, viewportSize.width - WINDOW_MARGIN * 2));
426
+ const currentRestoredPosition = isMaximized ? { left: WINDOW_MARGIN, top: WINDOW_MARGIN } : (position ?? seedPosition);
427
+ const currentRestoredSize = isMaximized
428
+ ? {
429
+ width: Math.max(MIN_WINDOW_WIDTH, viewportSize.width - WINDOW_MARGIN * 2),
430
+ height: Math.max(MIN_WINDOW_HEIGHT, viewportSize.height - WINDOW_MARGIN * 2),
431
+ }
432
+ : size;
433
+ if (windowMode === "minimized") {
434
+ if (!isOnFeedbackPath) {
435
+ void revealOpenFeedback(report);
436
+ }
437
+ else {
438
+ focusReplyWindow(report.id);
439
+ }
440
+ const from = {
441
+ left: dockPosition.left,
442
+ top: dockPosition.top,
443
+ width: currentMinimizedWidth,
444
+ height: MINIMIZED_WINDOW_HEIGHT,
445
+ };
446
+ const to = {
447
+ left: currentRestoredPosition.left,
448
+ top: currentRestoredPosition.top,
449
+ width: currentRestoredSize.width,
450
+ height: currentRestoredSize.height,
451
+ };
452
+ setWindowMode("normal");
453
+ setReplyWindowMinimized(report.id, false);
454
+ if (prefersReducedMotion()) {
455
+ setDockMorph(null);
456
+ return;
457
+ }
458
+ runDockMorph("restoring", from, to);
459
+ return;
460
+ }
461
+ const nextMinimizedIds = minimizedReplyReportIds.includes(report.id) ? minimizedReplyReportIds : [...minimizedReplyReportIds, report.id];
462
+ const nextDockIndex = Math.max(0, nextMinimizedIds.indexOf(report.id));
463
+ const nextDock = resolveMinimizedDockPosition(nextDockIndex, nextMinimizedIds.length, viewportSize.width, viewportSize.height, currentMinimizedWidth, MINIMIZED_WINDOW_HEIGHT);
464
+ const from = {
465
+ left: currentRestoredPosition.left,
466
+ top: currentRestoredPosition.top,
467
+ width: currentRestoredSize.width,
468
+ height: currentRestoredSize.height,
469
+ };
470
+ const to = {
471
+ left: nextDock.left,
472
+ top: nextDock.top,
473
+ width: currentMinimizedWidth,
474
+ height: MINIMIZED_WINDOW_HEIGHT,
475
+ };
476
+ setReplyWindowMinimized(report.id, true);
477
+ if (prefersReducedMotion()) {
478
+ setWindowMode("minimized");
479
+ setDockMorph(null);
480
+ clearHoverLeaveTimeout();
481
+ setHoveredMarkerId((current) => (current === report.id ? null : current));
482
+ return;
483
+ }
484
+ runDockMorph("minimizing", from, to, () => {
485
+ setWindowMode("minimized");
486
+ });
487
+ clearHoverLeaveTimeout();
488
+ setHoveredMarkerId((current) => (current === report.id ? null : current));
249
489
  };
490
+ const handleMinimizedDockPointerDown = useCallback((event) => {
491
+ if (event.button !== 0 || dockMorph !== null || windowMode !== "minimized" || minimizedReplyReportIds.length < 2) {
492
+ return;
493
+ }
494
+ event.preventDefault();
495
+ event.stopPropagation();
496
+ detachDockDragListeners();
497
+ const rect = windowRef.current?.getBoundingClientRect();
498
+ const initial = {
499
+ pointerId: event.pointerId,
500
+ startX: event.clientX,
501
+ startY: event.clientY,
502
+ offsetX: rect ? event.clientX - rect.left : minimizedWidth / 2,
503
+ offsetY: rect ? event.clientY - rect.top : MINIMIZED_WINDOW_HEIGHT / 2,
504
+ pointerX: event.clientX,
505
+ pointerY: event.clientY,
506
+ active: false,
507
+ };
508
+ dockDragRef.current = initial;
509
+ setDockDrag(initial);
510
+ const handlePointerMove = (moveEvent) => {
511
+ const state = dockDragRef.current;
512
+ if (!state || moveEvent.pointerId !== state.pointerId) {
513
+ return;
514
+ }
515
+ const distance = Math.hypot(moveEvent.clientX - state.startX, moveEvent.clientY - state.startY);
516
+ const nextActive = state.active || distance >= MINIMIZED_DOCK_DRAG_THRESHOLD_PX;
517
+ if (nextActive && !state.active) {
518
+ suppressDockRestoreClickRef.current = true;
519
+ }
520
+ const next = {
521
+ ...state,
522
+ pointerX: moveEvent.clientX,
523
+ pointerY: moveEvent.clientY,
524
+ active: nextActive,
525
+ };
526
+ dockDragRef.current = next;
527
+ setDockDrag(next);
528
+ if (!nextActive) {
529
+ return;
530
+ }
531
+ const ids = minimizedReplyReportIdsRef.current;
532
+ const fromIndex = ids.indexOf(report.id);
533
+ if (fromIndex < 0 || ids.length < 2) {
534
+ return;
535
+ }
536
+ const viewportWidth = window.innerWidth;
537
+ const itemWidth = Math.min(MINIMIZED_WINDOW_WIDTH, Math.max(0, viewportWidth - WINDOW_MARGIN * 2));
538
+ const centerX = moveEvent.clientX - state.offsetX + itemWidth / 2;
539
+ const toIndex = resolveMinimizedDockIndexFromPointer(centerX, ids.length, viewportWidth, itemWidth);
540
+ if (toIndex !== fromIndex) {
541
+ reorderMinimizedReplyWindow(report.id, toIndex);
542
+ }
543
+ };
544
+ const handlePointerUp = (upEvent) => {
545
+ const state = dockDragRef.current;
546
+ if (!state || upEvent.pointerId !== state.pointerId) {
547
+ return;
548
+ }
549
+ detachDockDragListeners();
550
+ dockDragRef.current = null;
551
+ setDockDrag(null);
552
+ };
553
+ dockDragListenersRef.current = { move: handlePointerMove, up: handlePointerUp };
554
+ window.addEventListener("pointermove", handlePointerMove, true);
555
+ window.addEventListener("pointerup", handlePointerUp, true);
556
+ window.addEventListener("pointercancel", handlePointerUp, true);
557
+ }, [detachDockDragListeners, dockMorph, minimizedReplyReportIds.length, minimizedWidth, reorderMinimizedReplyWindow, report.id, windowMode]);
558
+ const handleMinimizedDockClickCapture = useCallback((event) => {
559
+ if (!suppressDockRestoreClickRef.current) {
560
+ return;
561
+ }
562
+ event.preventDefault();
563
+ event.stopPropagation();
564
+ suppressDockRestoreClickRef.current = false;
565
+ }, []);
250
566
  const handleToggleMaximize = () => {
567
+ if (dockMorph) {
568
+ return;
569
+ }
570
+ if (!isOnFeedbackPath) {
571
+ void revealOpenFeedback(report);
572
+ return;
573
+ }
574
+ if (!isFocused) {
575
+ focusReplyWindow(report.id);
576
+ }
251
577
  setWindowMode((current) => (current === "maximized" ? "normal" : "maximized"));
252
578
  };
579
+ const handleWindowActivate = () => {
580
+ if (!isOnFeedbackPath) {
581
+ void revealOpenFeedback(report);
582
+ return;
583
+ }
584
+ if (!isFocused) {
585
+ focusReplyWindow(report.id);
586
+ }
587
+ };
588
+ const handleAddCase = () => {
589
+ beginComposeNewCase();
590
+ };
591
+ const handleSidebarDelete = () => {
592
+ if (!isSidebarDeleteConfirming) {
593
+ setIsSidebarDeleteConfirming(true);
594
+ return;
595
+ }
596
+ void handleDelete(report.id).finally(() => setIsSidebarDeleteConfirming(false));
597
+ };
253
598
  const leftControls = (_jsxs(_Fragment, { children: [_jsx(WindowControlButton, { onClick: requestClose, ariaLabel: messages.marker.windowCloseAriaLabel, children: _jsx(CloseIcon, { className: "h-[15px] w-[15px]" }) }), _jsx(WindowControlButton, { onClick: handleToggleMinimize, ariaLabel: isMinimized ? messages.marker.windowRestoreAriaLabel : messages.marker.windowMinimizeAriaLabel, children: _jsx(MinimizeIcon, { className: "h-[15px] w-[15px]" }) }), _jsx(WindowControlButton, { onClick: handleToggleMaximize, ariaLabel: isMaximized ? messages.marker.windowRestoreAriaLabel : messages.marker.windowMaximizeAriaLabel, children: isMaximized ? _jsx(RestoreIcon, { className: "h-[15px] w-[15px]" }) : _jsx(MaximizeIcon, { className: "h-[15px] w-[15px]" }) })] }));
254
599
  const sidebarToggleButton = (_jsx(WindowControlButton, { onClick: () => setIsSidebarCollapsed((current) => !current), ariaLabel: isSidebarCollapsed ? messages.marker.sidebarExpandAriaLabel : messages.marker.sidebarCollapseAriaLabel, className: isSidebarCollapsed ? "" : "text-[var(--adaptive-blue500)]", children: _jsx(SidePanelIcon, { className: "h-[16px] w-[16px]" }) }));
255
600
  const shareButton = (_jsx(MarkerWindowShareButton, { report: report, messages: messages }));
256
- const pinButton = (_jsx(FeedbackPinToggleButton, { report: report, caseId: focusedCaseId, className: HEADER_BUTTON_CLASS, iconClassName: "h-[14px] w-[14px]" }));
257
- const deleteButton = canDeleteFeedback(report, sessionActor) ? (_jsx(FeedbackDeleteAction, { reportId: report.id, onDelete: handleDelete, disabled: isDeleting, messages: messages, className: `${HEADER_BUTTON_CLASS} disabled:opacity-50`, iconClassName: "h-[15px] w-[15px]" })) : null;
601
+ const askAiButton = (_jsx(MarkerWindowAskAiButton, { report: report, fields: fields, messages: messages, focusedCaseId: focusedCaseId }));
602
+ const deleteButton = canDeleteFeedback(report, sessionActor) ? (_jsx(FeedbackDeleteAction, { reportId: report.id, onDelete: handleDelete, disabled: isDeleting, locked: deleteLock.locked, lockLabel: deleteLock.tooltipLabel, messages: messages, className: `${HEADER_BUTTON_CLASS} disabled:opacity-50`, iconClassName: "h-[15px] w-[15px]" })) : null;
258
603
  const editButton = canEditReportCases(report) ? (_jsx(HoverTooltip, { label: messages.feedbackList.editTitle, children: _jsx("button", { type: "button", "data-fivepixels-interactive": "", className: HEADER_BUTTON_CLASS, "aria-label": messages.feedbackList.editAriaLabel, title: messages.feedbackList.editTitle, onPointerDown: (event) => event.stopPropagation(), onClick: () => beginFeedbackEdit(report), children: _jsx(EditIcon, { className: "h-[14px] w-[14px]" }) }) })) : null;
259
- const headerUtilityButtons = (_jsxs(_Fragment, { children: [shareButton, editButton, deleteButton, pinButton] }));
260
- const rightSection = (_jsxs("div", { className: "flex min-w-0 flex-1 flex-col bg-[var(--adaptive-black50)]", children: [_jsx("header", { onPointerDown: handleDragHandlePointerDown, className: "shrink-0 cursor-move touch-none select-none border-b border-[var(--adaptive-border-subtle)] px-[16px] py-[8px]", children: focusedCase ? (_jsxs(Fragment, { children: [_jsx("p", { className: "truncate text-[15px] font-semibold leading-[1.4] text-[var(--adaptive-black900)]", title: mentionMessageToPlainText(focusedCase.text, focusedCase.mentions), children: mentionMessageToPlainText(focusedCase.text, focusedCase.mentions) }), _jsxs("div", { className: "mt-[2px] flex min-w-0 items-center justify-between gap-[8px]", children: [_jsx("div", { className: "flex min-w-0 flex-1 items-center gap-[6px]", children: focusedCase.status === "resolved" ? (_jsxs(_Fragment, { children: [_jsx(CheckCircleIcon, { className: "h-[14px] w-[14px] shrink-0", fill: RESOLVED_STATUS_COLOR }), _jsx("p", { className: "min-w-0 truncate text-[12px] font-semibold leading-[1.4]", style: { color: RESOLVED_STATUS_COLOR }, children: messages.thread.issueResolvedDivider })] })) : showAssigneeAssigned ? (_jsxs(_Fragment, { children: [_jsx(ProcessingDots, {}), _jsx(Text.Shimmer, { className: "min-w-0 truncate text-[12px] leading-[1.4]", color: {
604
+ const expandedSidebarActions = (_jsxs("nav", { "aria-label": messages.marker.sidebarActionsAriaLabel, className: "shrink-0 px-[6px] pb-[10px] pt-[2px]", children: [canEditReportCases(report) ? (_jsxs("button", { type: "button", "data-fivepixels-interactive": "", onPointerDown: (event) => event.stopPropagation(), onClick: handleAddCase, className: SIDEBAR_ACTION_CLASS, children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-[15px] w-[15px] shrink-0 items-center justify-center text-[18px] font-normal", children: "+" }), _jsx("span", { children: messages.marker.newCaseAction })] })) : null, _jsx(MarkerWindowShareButton, { report: report, messages: messages, expanded: true }), _jsx(MarkerWindowAskAiButton, { report: report, fields: fields, messages: messages, focusedCaseId: focusedCaseId, expanded: true })] }));
605
+ const expandedSidebarDelete = canDeleteFeedback(report, sessionActor) ? (_jsx("div", { className: "mt-auto shrink-0 border-t border-[var(--adaptive-border-subtle)] p-[6px]", children: _jsxs("button", { type: "button", "data-fivepixels-interactive": "", onPointerDown: (event) => event.stopPropagation(), onClick: handleSidebarDelete, disabled: isDeleting, "aria-label": isSidebarDeleteConfirming ? messages.feedbackList.deleteConfirmAriaLabel : messages.feedbackList.deleteAriaLabel, className: `${SIDEBAR_ACTION_CLASS} text-rose-500 hover:text-rose-600 disabled:opacity-50`, children: [_jsx(TrashIcon, { className: "h-[15px] w-[15px] shrink-0" }), _jsx("span", { children: isSidebarDeleteConfirming ? messages.feedbackList.deleteConfirmTitle : messages.feedbackList.deleteTitle })] }) })) : null;
606
+ const unfocusedBody = (_jsx("div", { className: "flex min-h-0 min-w-0 flex-1 items-center justify-center bg-[var(--adaptive-black50)]", children: _jsx(UnfocusedCaseSummary, { caseTexts: caseTexts, emptyLabel: messages.cases.selectToView, navigateHint: isOnFeedbackPath ? undefined : messages.marker.offscreenNavigateHint }) }));
607
+ const rightSection = (_jsxs("div", { className: "flex min-w-0 flex-1 flex-col bg-[var(--adaptive-black50)]", children: [_jsx("header", { onPointerDown: handleDragHandlePointerDown, className: "shrink-0 cursor-move touch-none select-none border-b border-[var(--adaptive-border-subtle)] px-[16px] py-[8px]", children: isComposingCaseInThisWindow ? (_jsxs(Fragment, { children: [_jsx("p", { className: "truncate text-[15px] font-semibold leading-[1.4] text-[var(--adaptive-blue400)]", children: messages.cases.composingCaseTitle }), _jsx("p", { className: "mt-[2px] text-[12px] leading-[1.4] text-[var(--adaptive-black500)]", children: messages.cases.open })] })) : focusedCase ? (_jsxs(Fragment, { children: [_jsx("p", { className: "truncate text-[15px] font-semibold leading-[1.4] text-[var(--adaptive-black900)]", title: mentionMessageToPlainText(focusedCase.text, focusedCase.mentions), children: mentionMessageToPlainText(focusedCase.text, focusedCase.mentions) }), _jsxs("div", { className: "mt-[2px] flex min-w-0 items-center justify-between gap-[8px]", children: [_jsx("div", { className: "flex min-w-0 flex-1 items-center gap-[6px]", children: focusedCase.status === "resolved" ? (_jsxs(_Fragment, { children: [_jsx(CheckCircleIcon, { className: "h-[14px] w-[14px] shrink-0", fill: RESOLVED_STATUS_COLOR }), _jsx("p", { className: "min-w-0 truncate text-[12px] font-semibold leading-[1.4]", style: { color: RESOLVED_STATUS_COLOR }, children: messages.thread.issueResolvedDivider })] })) : showAssigneeAssigned ? (_jsxs(_Fragment, { children: [_jsx(ProcessingDots, {}), _jsx(Text.Shimmer, { className: "min-w-0 truncate text-[12px] leading-[1.4]", color: {
261
608
  start: "var(--adaptive-black900)",
262
609
  end: "var(--adaptive-blue400)",
263
- }, duration: 5, children: messages.marker.assigneeAssigned })] })) : (_jsx("p", { className: "min-w-0 truncate text-[12px] leading-[1.4] text-[var(--adaptive-black500)]", children: messages.marker.assigneeUnassigned })) }), _jsxs("div", { className: "flex min-w-0 shrink-0 items-center gap-[8px]", children: [_jsx(FeedbackFieldTags, { tags: fieldTags }), showAssigneeAssigned && focusedCase ? (_jsx(CaseAssigneeInfo, { caseItem: focusedCase, authors: authors })) : null] })] })] })) : (_jsx("p", { className: "text-[13px] text-[var(--adaptive-black500)]", children: messages.cases.selectToView })) }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: _jsx(FeedbackThread, { report: report, authors: authors, pendingComposer: pendingComposer, confirmAuthorName: confirmAuthorName, showConfirmAuthorSelect: showConfirmAuthorSelect, onConfirmAuthorNameChange: setConfirmAuthorName, onToggleConfirmAuthorSelect: toggleConfirmAuthorSelect, onStartDeny: startDenyReview, onStartCheckout: startCheckoutReview, onStartAskQuestion: startAskQuestion, onClaimAssignee: () => void handleClaimAssignee(), onTransferAssignee: () => void handleTransferAssignee(), onConfirm: () => void handleConfirmResolution(), isUpdating: isUpdating, isClaimingAssignee: isClaimingAssignee, hideCaseSelector: true }) }), showComposer ? (_jsx("section", { className: "shrink-0 overflow-visible border-t border-[var(--adaptive-border-subtle)]", children: _jsx(FeedbackComposer, { message: replyDraft, onMessageChange: (value) => {
610
+ }, duration: 5, children: messages.marker.assigneeAssigned })] })) : (_jsx("p", { className: "min-w-0 truncate text-[12px] leading-[1.4] text-[var(--adaptive-black500)]", children: messages.marker.assigneeUnassigned })) }), _jsxs("div", { className: "flex min-w-0 shrink-0 items-center gap-[8px]", children: [_jsx(FeedbackFieldTags, { tags: fieldTags }), showAssigneeAssigned && focusedCase ? (_jsx(CaseAssigneeInfo, { caseItem: focusedCase, authors: authors })) : null] })] })] })) : (_jsx("p", { className: "text-[13px] text-[var(--adaptive-black500)]", children: messages.cases.selectToView })) }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "min-h-0 flex-1 overflow-hidden", children: isComposingCaseInThisWindow ? (_jsx("div", { className: "h-full w-full bg-[var(--adaptive-black50)]" })) : (_jsx(FeedbackThread, { report: report, authors: authors, pendingComposer: pendingComposer, confirmAuthorName: confirmAuthorName, showConfirmAuthorSelect: showConfirmAuthorSelect, onConfirmAuthorNameChange: setConfirmAuthorName, onToggleConfirmAuthorSelect: toggleConfirmAuthorSelect, onStartDeny: startDenyReview, onStartCheckout: startCheckoutReview, onStartAskQuestion: startAskQuestion, onClaimAssignee: () => void handleClaimAssignee(), onTransferAssignee: () => void handleTransferAssignee(), onConfirm: () => void handleConfirmResolution(), isUpdating: isUpdating, isClaimingAssignee: isClaimingAssignee, hideCaseSelector: true })) }), showComposer ? (_jsx("section", { className: "shrink-0 overflow-visible border-t border-[var(--adaptive-border-subtle)]", children: _jsx(FeedbackComposer, { message: replyDraft, onMessageChange: (value) => {
264
611
  setReplyDraft(value);
265
612
  if (errorMessage) {
266
613
  setErrorMessage("");
267
614
  }
268
- }, mentions: replyMentions, onMentionsChange: setReplyMentions, enableElementMentions: true, authorName: replyAuthorName, onAuthorNameChange: setReplyAuthorName, authors: authors, fields: fields, fieldValues: report.field_values, onFieldChange: () => undefined, showTags: false, hideAuthorSelector: true, onSubmit: () => void handleReplySubmit(), isSubmitting: isSubmittingReply || isUpdating, autoFocus: pendingComposer !== null, askQuestionForced: isCreatorQuestionComposer, composerMode: pendingComposer?.type ?? null, onCancelComposerMode: cancelPendingComposer, replyTargetPreview: replyTargetPreview, errorMessage: errorMessage }) })) : null] })] }));
269
- return (_jsxs(_Fragment, { children: [isResizing ? _jsx(CornerResizeGhost, { ghostRef: ghostRef }) : null, _jsx("div", { ref: bindWindowRef, "data-fivepixels-interactive": "", onClick: (event) => event.stopPropagation(), onAnimationEnd: handleWindowAnimationEnd, className: `fixed z-[1000001] ${windowAnimationClass}`, style: {
270
- left: resolvedPosition.left,
271
- top: resolvedPosition.top,
272
- width: effectiveSize.width,
273
- ...(isMinimized ? null : { height: effectiveSize.height }),
274
- }, children: isMinimized ? (_jsxs("div", { ref: surfaceRef, className: `flex items-center justify-between gap-[8px] overflow-hidden rounded-[16px] border border-[var(--adaptive-border-subtle)] px-[10px] py-[8px] shadow-[var(--adaptive-popup-shadow)] ${leftSectionClass}`, children: [_jsx("div", { onPointerDown: handleDragHandlePointerDown, className: "flex flex-1 cursor-move touch-none select-none items-center gap-[2px]", children: leftControls }), shareButton, editButton, deleteButton, sidebarToggleButton] })) : (_jsxs("div", { ref: surfaceRef, className: "flex h-full w-full flex-row overflow-hidden rounded-[16px] shadow-[var(--adaptive-popup-shadow)] border border-[var(--adaptive-border-subtle)]", children: [isSidebarCollapsed ? (_jsxs("div", { onPointerDown: handleDragHandlePointerDown, className: `flex shrink-0 cursor-move touch-none select-none flex-col items-center gap-[2px] py-[8px] ${leftSectionClass}`, style: { width: COLLAPSED_SIDEBAR_WIDTH }, children: [leftControls, shareButton, editButton, deleteButton, pinButton, sidebarToggleButton] })) : (_jsxs("div", { className: `flex shrink-0 flex-col overflow-hidden ${leftSectionClass}`, style: { width: resolvedSidebarWidth }, children: [_jsxs("header", { onPointerDown: handleDragHandlePointerDown, className: "flex shrink-0 cursor-move touch-none select-none items-center justify-between gap-[8px] px-[10px] py-[8px]", children: [_jsx("div", { className: "flex items-center gap-[2px]", children: leftControls }), _jsxs("div", { className: "flex items-center gap-[2px]", children: [headerUtilityButtons, sidebarToggleButton] })] }), _jsx(MarkerCaseSidebar, { report: report, focusedCaseId: focusedCaseId, onSelectCase: selectCase })] })), isSidebarCollapsed ? null : (_jsx("div", { role: "separator", "aria-orientation": "vertical", onPointerDown: handleSplitPointerDown, className: "group relative w-[3px] shrink-0 cursor-col-resize touch-none self-stretch bg-[var(--adaptive-black50)] group-hover:bg-[var(--adaptive-blue500)] transition-colors", children: _jsx("span", { className: "absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-[var(--adaptive-border-subtle)] transition-colors group-hover:bg-[var(--adaptive-blue500)] touch-none pointer-events-none" }) })), rightSection, windowMode === "normal" ? (_jsx(CornerResizeHandle, { corner: "bottom-right", ariaLabel: messages.marker.resizeAriaLabel, onPointerDown: handleResizePointerDown })) : null] })) })] }));
615
+ }, mentions: replyMentions, onMentionsChange: setReplyMentions, enableElementMentions: true, authorName: replyAuthorName, onAuthorNameChange: setReplyAuthorName, authors: authors, fields: fields, fieldValues: report.field_values, onFieldChange: () => undefined, showTags: false, hideAuthorSelector: true, onSubmit: () => void handleReplySubmit(), isSubmitting: isSubmittingReply || isUpdating, autoFocus: isComposingCaseInThisWindow || pendingComposer !== null, placeholder: isComposingCaseInThisWindow ? messages.cases.composingCasePlaceholder : undefined, askQuestionForced: isComposingCaseInThisWindow ? false : isCreatorQuestionComposer, composerMode: isComposingCaseInThisWindow ? null : (pendingComposer?.type ?? null), onCancelComposerMode: isComposingCaseInThisWindow ? undefined : cancelPendingComposer, replyTargetPreview: isComposingCaseInThisWindow ? null : replyTargetPreview, errorMessage: errorMessage }) })) : null] })] }));
616
+ return (_jsxs(_Fragment, { children: [isResizing ? _jsx(CornerResizeGhost, { ghostRef: ghostRef }) : null, _jsx("div", { ref: bindWindowRef, "data-fivepixels-interactive": "", "data-marker-feedback-window": report.id, "data-marker-window-focused": showFullContent ? "true" : "false", onPointerDown: handleWindowActivate, onClick: (event) => event.stopPropagation(), onAnimationEnd: handleWindowAnimationEnd, className: `fixed rounded-[16px] ${showMinimizedChrome && dockMorph === null && !isDockDragging ? "" : "overflow-hidden"} ${isDockDragging ? "z-[1000003]" : showFullContent ? "z-[1000002]" : "z-[1000001]"} ${windowAnimationClass}`, style: {
617
+ left: displayRect.left,
618
+ top: displayRect.top,
619
+ width: displayRect.width,
620
+ height: displayRect.height,
621
+ ...(layoutTransition ? { transition: layoutTransition } : null),
622
+ ...(isDockDragging ? { cursor: "grabbing", transform: "scale(1.03)", willChange: "left, top, transform" } : null),
623
+ }, children: showMinimizedChrome ? (_jsxs("div", { className: `group/min-dock relative h-full w-full ${minimizedReplyReportIds.length > 1 ? "cursor-grab" : ""} ${isDockDragging ? "cursor-grabbing" : ""}`, onPointerDown: handleMinimizedDockPointerDown, onClickCapture: handleMinimizedDockClickCapture, children: [_jsx("div", { ref: surfaceRef, className: `flex h-full w-full overflow-hidden rounded-[16px] border border-[var(--adaptive-border-subtle)] shadow-[var(--adaptive-popup-shadow)] ${leftSectionClass}`, children: _jsxs("div", { className: "flex w-full flex-col justify-center gap-[2px] overflow-hidden px-[12px] py-[6px]", children: [_jsxs("button", { type: "button", "data-fivepixels-interactive": "", onClick: handleToggleMinimize, disabled: dockMorph !== null, "aria-label": `${messages.marker.windowRestoreAriaLabel}. ${report.pathname}. ${minimizedCaseTexts.map((text, index) => `${index + 1}. ${text}`).join(", ")}`, title: messages.marker.windowRestoreAriaLabel, className: "flex min-w-0 items-center gap-[4px] text-left", children: [_jsx("p", { className: "shrink-0 rounded-[4px] bg-[var(--adaptive-tintOpacity300)] px-[2px] py-[2px] text-[10px]", children: "Route" }), _jsx("p", { className: "min-w-0 truncate text-[10px] font-semibold leading-none text-[var(--adaptive-accent-coral)]", children: report.pathname })] }), _jsx(MinimizedWindowAliasRow, { projectId: projectId, reportId: report.id, caseTexts: minimizedCaseTexts, messages: messages, onRestore: handleToggleMinimize, restoreDisabled: dockMorph !== null })] }) }), _jsx("button", { type: "button", "data-fivepixels-interactive": "", "aria-label": messages.marker.windowCloseAriaLabel, title: messages.marker.windowCloseAriaLabel, disabled: dockMorph !== null || windowSurfacePhase === "exiting" || isDockDragging, onPointerDown: (event) => event.stopPropagation(), onClick: (event) => {
624
+ event.stopPropagation();
625
+ requestClose();
626
+ }, className: `absolute right-[6px] top-[6px] z-[2] inline-flex h-[22px] w-[22px] items-center justify-center rounded-full border border-[var(--adaptive-border-subtle)] bg-[var(--adaptive-black100)] text-[var(--adaptive-black700)] shadow-[var(--adaptive-popup-shadow)] transition-[opacity,transform] duration-150 ease-[cubic-bezier(0.22,1,0.36,1)] hover:bg-[var(--adaptive-black200)] hover:text-[var(--adaptive-black900)] ${dockMorph !== null || isDockDragging
627
+ ? "pointer-events-none scale-90 opacity-0"
628
+ : "pointer-events-none scale-90 opacity-0 group-hover/min-dock:pointer-events-auto group-hover/min-dock:scale-100 group-hover/min-dock:opacity-100"}`, children: _jsx(CloseIcon, { className: "h-[12px] w-[12px]" }) })] })) : (_jsxs("div", { ref: surfaceRef, className: "flex h-full w-full flex-row overflow-hidden rounded-[16px] border border-[var(--adaptive-border-subtle)] shadow-[var(--adaptive-popup-shadow)]", children: [showFullContent ? (_jsxs(_Fragment, { children: [isSidebarCollapsed ? (_jsxs("div", { onPointerDown: handleDragHandlePointerDown, className: `flex shrink-0 cursor-move touch-none select-none flex-col items-center gap-[2px] py-[8px] ${leftSectionClass}`, style: { width: COLLAPSED_SIDEBAR_WIDTH }, children: [leftControls, shareButton, askAiButton, editButton, deleteButton, sidebarToggleButton] })) : (_jsxs("div", { className: `flex shrink-0 flex-col overflow-hidden ${leftSectionClass}`, style: { width: resolvedSidebarWidth }, children: [_jsxs("header", { onPointerDown: handleDragHandlePointerDown, className: "flex shrink-0 cursor-move touch-none select-none items-center justify-between gap-[8px] px-[10px] py-[8px]", children: [_jsx("div", { className: "flex items-center gap-[2px]", children: leftControls }), _jsx("div", { className: "flex items-center gap-[2px]", children: sidebarToggleButton })] }), expandedSidebarActions, _jsx(MarkerCaseSidebar, { report: report, focusedCaseId: focusedCaseId, isComposingNewCase: isComposingCaseInThisWindow, composingCaseTitle: messages.cases.composingCaseTitle, onSelectCase: selectCase, onSelectComposingCase: beginComposeNewCase }), expandedSidebarDelete] })), isSidebarCollapsed ? null : (_jsx("div", { role: "separator", "aria-orientation": "vertical", onPointerDown: handleSplitPointerDown, className: "group relative w-[3px] shrink-0 cursor-col-resize touch-none self-stretch bg-[var(--adaptive-black50)] transition-colors group-hover:bg-[var(--adaptive-blue500)]", children: _jsx("span", { className: "pointer-events-none absolute inset-y-0 left-1/2 w-px -translate-x-1/2 touch-none bg-[var(--adaptive-border-subtle)] transition-colors group-hover:bg-[var(--adaptive-blue500)]" }) })), rightSection] })) : (_jsxs(_Fragment, { children: [_jsx("div", { onPointerDown: handleDragHandlePointerDown, className: `flex shrink-0 cursor-move touch-none select-none flex-col items-center gap-[2px] py-[8px] ${leftSectionClass}`, style: { width: COLLAPSED_SIDEBAR_WIDTH }, children: leftControls }), unfocusedBody] })), windowMode === "normal" && dockMorph === null ? (_jsx(CornerResizeHandle, { corner: "bottom-right", ariaLabel: messages.marker.resizeAriaLabel, onPointerDown: handleResizePointerDown })) : null] })) })] }));
275
629
  }
276
630
  //# sourceMappingURL=MarkerFeedbackWindow.js.map