@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.
- package/README.md +42 -28
- package/dist/components/icons/Icons.d.ts +11 -3
- package/dist/components/icons/Icons.d.ts.map +1 -1
- package/dist/components/icons/Icons.js +19 -3
- package/dist/components/icons/Icons.js.map +1 -1
- package/dist/components/overlay/DotWaveOverlay.d.ts.map +1 -1
- package/dist/components/overlay/DotWaveOverlay.js +1 -3
- package/dist/components/overlay/DotWaveOverlay.js.map +1 -1
- package/dist/components/overlay/ElementMemoComposer.d.ts +2 -0
- package/dist/components/overlay/ElementMemoComposer.d.ts.map +1 -0
- package/dist/components/overlay/ElementMemoComposer.js +51 -0
- package/dist/components/overlay/ElementMemoComposer.js.map +1 -0
- package/dist/components/overlay/PickTargetContextMenu.d.ts +2 -1
- package/dist/components/overlay/PickTargetContextMenu.d.ts.map +1 -1
- package/dist/components/overlay/PickTargetContextMenu.js +5 -5
- package/dist/components/overlay/PickTargetContextMenu.js.map +1 -1
- package/dist/components/overlay/PickTargetHoverTooltip.d.ts.map +1 -1
- package/dist/components/overlay/PickTargetHoverTooltip.js +1 -1
- package/dist/components/overlay/PickTargetHoverTooltip.js.map +1 -1
- package/dist/components/overlay/PickTargetSavedBadges.d.ts.map +1 -1
- package/dist/components/overlay/PickTargetSavedBadges.js +23 -11
- package/dist/components/overlay/PickTargetSavedBadges.js.map +1 -1
- package/dist/components/overlay/ReportOverlayLayer.d.ts +1 -1
- package/dist/components/overlay/ReportOverlayLayer.d.ts.map +1 -1
- package/dist/components/overlay/ReportOverlayLayer.js +13 -3
- package/dist/components/overlay/ReportOverlayLayer.js.map +1 -1
- package/dist/components/panel/DraftNetworkErrorBanner.d.ts +2 -0
- package/dist/components/panel/DraftNetworkErrorBanner.d.ts.map +1 -0
- package/dist/components/panel/DraftNetworkErrorBanner.js +13 -0
- package/dist/components/panel/DraftNetworkErrorBanner.js.map +1 -0
- package/dist/components/panel/FeedbackActivityHeatmap.d.ts.map +1 -1
- package/dist/components/panel/FeedbackActivityHeatmap.js +10 -6
- package/dist/components/panel/FeedbackActivityHeatmap.js.map +1 -1
- package/dist/components/panel/MarkerShapePicker.d.ts +2 -1
- package/dist/components/panel/MarkerShapePicker.d.ts.map +1 -1
- package/dist/components/panel/MarkerShapePicker.js +9 -4
- package/dist/components/panel/MarkerShapePicker.js.map +1 -1
- package/dist/components/panel/MarkerSizePreview.d.ts +2 -1
- package/dist/components/panel/MarkerSizePreview.d.ts.map +1 -1
- package/dist/components/panel/MarkerSizePreview.js +7 -2
- package/dist/components/panel/MarkerSizePreview.js.map +1 -1
- package/dist/components/panel/PanelGateShell.d.ts +2 -0
- package/dist/components/panel/PanelGateShell.d.ts.map +1 -1
- package/dist/components/panel/PanelGateShell.js +2 -0
- package/dist/components/panel/PanelGateShell.js.map +1 -1
- package/dist/components/panel/PanelIntegrationSettings.d.ts +2 -0
- package/dist/components/panel/PanelIntegrationSettings.d.ts.map +1 -0
- package/dist/components/panel/PanelIntegrationSettings.js +41 -0
- package/dist/components/panel/PanelIntegrationSettings.js.map +1 -0
- package/dist/components/panel/PanelNetworkFailureBanner.d.ts +2 -0
- package/dist/components/panel/PanelNetworkFailureBanner.d.ts.map +1 -0
- package/dist/components/panel/PanelNetworkFailureBanner.js +13 -0
- package/dist/components/panel/PanelNetworkFailureBanner.js.map +1 -0
- package/dist/components/panel/PanelOnboarding.d.ts.map +1 -1
- package/dist/components/panel/PanelOnboarding.js +119 -5
- package/dist/components/panel/PanelOnboarding.js.map +1 -1
- package/dist/components/panel/PanelProjectFooter.d.ts.map +1 -1
- package/dist/components/panel/PanelProjectFooter.js +6 -2
- package/dist/components/panel/PanelProjectFooter.js.map +1 -1
- package/dist/components/panel/PanelSettings.d.ts.map +1 -1
- package/dist/components/panel/PanelSettings.js +29 -9
- package/dist/components/panel/PanelSettings.js.map +1 -1
- package/dist/components/panel/PanelTeamSettings.d.ts.map +1 -1
- package/dist/components/panel/PanelTeamSettings.js +5 -1
- package/dist/components/panel/PanelTeamSettings.js.map +1 -1
- package/dist/components/panel/ReportApiFlowPanel.d.ts +2 -0
- package/dist/components/panel/ReportApiFlowPanel.d.ts.map +1 -0
- package/dist/components/panel/ReportApiFlowPanel.js +63 -0
- package/dist/components/panel/ReportApiFlowPanel.js.map +1 -0
- package/dist/components/panel/ReportControlPanel.d.ts.map +1 -1
- package/dist/components/panel/ReportControlPanel.js +19 -10
- package/dist/components/panel/ReportControlPanel.js.map +1 -1
- package/dist/components/panel/ReportDraftForm.d.ts.map +1 -1
- package/dist/components/panel/ReportDraftForm.js +29 -5
- package/dist/components/panel/ReportDraftForm.js.map +1 -1
- package/dist/components/panel/ReportFeedbackList.d.ts.map +1 -1
- package/dist/components/panel/ReportFeedbackList.js +17 -7
- package/dist/components/panel/ReportFeedbackList.js.map +1 -1
- package/dist/components/panel/experimental/ReportMyTasksPanel.d.ts.map +1 -1
- package/dist/components/panel/experimental/ReportMyTasksPanel.js +3 -39
- package/dist/components/panel/experimental/ReportMyTasksPanel.js.map +1 -1
- package/dist/components/panel/feedback/AskAiCopyDropdown.d.ts +20 -0
- package/dist/components/panel/feedback/AskAiCopyDropdown.d.ts.map +1 -0
- package/dist/components/panel/feedback/AskAiCopyDropdown.js +27 -0
- package/dist/components/panel/feedback/AskAiCopyDropdown.js.map +1 -0
- package/dist/components/panel/feedback/FeedbackDeleteAction.d.ts +3 -1
- package/dist/components/panel/feedback/FeedbackDeleteAction.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackDeleteAction.js +7 -3
- package/dist/components/panel/feedback/FeedbackDeleteAction.js.map +1 -1
- package/dist/components/panel/feedback/FeedbackListItem.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackListItem.js +7 -3
- package/dist/components/panel/feedback/FeedbackListItem.js.map +1 -1
- package/dist/components/panel/feedback/FeedbackThread.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackThread.js +20 -4
- package/dist/components/panel/feedback/FeedbackThread.js.map +1 -1
- package/dist/components/panel/feedback/ThreadAskAiFloatingButton.d.ts +11 -0
- package/dist/components/panel/feedback/ThreadAskAiFloatingButton.d.ts.map +1 -0
- package/dist/components/panel/feedback/ThreadAskAiFloatingButton.js +27 -0
- package/dist/components/panel/feedback/ThreadAskAiFloatingButton.js.map +1 -0
- package/dist/components/panel/feedback/ThreadChildReply.d.ts.map +1 -1
- package/dist/components/panel/feedback/ThreadChildReply.js +2 -1
- package/dist/components/panel/feedback/ThreadChildReply.js.map +1 -1
- package/dist/components/panel/feedback/ThreadTimelineRow.d.ts +4 -1
- package/dist/components/panel/feedback/ThreadTimelineRow.d.ts.map +1 -1
- package/dist/components/panel/feedback/ThreadTimelineRow.js +5 -2
- package/dist/components/panel/feedback/ThreadTimelineRow.js.map +1 -1
- package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.d.ts +45 -0
- package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.d.ts.map +1 -0
- package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.js +33 -0
- package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.js.map +1 -0
- package/dist/components/point/MarkerCaseSidebar.d.ts +4 -1
- package/dist/components/point/MarkerCaseSidebar.d.ts.map +1 -1
- package/dist/components/point/MarkerCaseSidebar.js +9 -8
- package/dist/components/point/MarkerCaseSidebar.js.map +1 -1
- package/dist/components/point/MarkerFeedbackWindow.d.ts +2 -1
- package/dist/components/point/MarkerFeedbackWindow.d.ts.map +1 -1
- package/dist/components/point/MarkerFeedbackWindow.js +412 -58
- package/dist/components/point/MarkerFeedbackWindow.js.map +1 -1
- package/dist/components/point/MemoMarkersLayer.d.ts +2 -0
- package/dist/components/point/MemoMarkersLayer.d.ts.map +1 -0
- package/dist/components/point/MemoMarkersLayer.js +60 -0
- package/dist/components/point/MemoMarkersLayer.js.map +1 -0
- package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -1
- package/dist/components/point/ReportMarkersLayer.js +31 -29
- package/dist/components/point/ReportMarkersLayer.js.map +1 -1
- package/dist/components/point/ReportOpenWindowsLayer.d.ts +2 -0
- package/dist/components/point/ReportOpenWindowsLayer.d.ts.map +1 -0
- package/dist/components/point/ReportOpenWindowsLayer.js +23 -0
- package/dist/components/point/ReportOpenWindowsLayer.js.map +1 -0
- package/dist/components/report/FivePixels.d.ts +2 -1
- package/dist/components/report/FivePixels.d.ts.map +1 -1
- package/dist/components/report/FivePixels.js +2 -3
- package/dist/components/report/FivePixels.js.map +1 -1
- package/dist/components/report/ReportView.d.ts.map +1 -1
- package/dist/components/report/ReportView.js +9 -9
- package/dist/components/report/ReportView.js.map +1 -1
- package/dist/components/report/index.d.ts +4 -1
- package/dist/components/report/index.d.ts.map +1 -1
- package/dist/components/report/index.js +2 -0
- package/dist/components/report/index.js.map +1 -1
- package/dist/components/ui/HoverTooltip.d.ts +2 -1
- package/dist/components/ui/HoverTooltip.d.ts.map +1 -1
- package/dist/components/ui/HoverTooltip.js +8 -3
- package/dist/components/ui/HoverTooltip.js.map +1 -1
- package/dist/components/ui/IntegrationLock.d.ts +22 -0
- package/dist/components/ui/IntegrationLock.d.ts.map +1 -0
- package/dist/components/ui/IntegrationLock.js +31 -0
- package/dist/components/ui/IntegrationLock.js.map +1 -0
- package/dist/constants/loginMethod.d.ts +5 -0
- package/dist/constants/loginMethod.d.ts.map +1 -0
- package/dist/constants/loginMethod.js +8 -0
- package/dist/constants/loginMethod.js.map +1 -0
- package/dist/constants/markerAppearance.d.ts +7 -5
- package/dist/constants/markerAppearance.d.ts.map +1 -1
- package/dist/constants/markerAppearance.js +8 -5
- package/dist/constants/markerAppearance.js.map +1 -1
- package/dist/constants/motionClasses.d.ts +2 -9
- package/dist/constants/motionClasses.d.ts.map +1 -1
- package/dist/constants/motionClasses.js +2 -9
- package/dist/constants/motionClasses.js.map +1 -1
- package/dist/constants/overlayChrome.d.ts +1 -6
- package/dist/constants/overlayChrome.d.ts.map +1 -1
- package/dist/constants/overlayChrome.js +1 -6
- package/dist/constants/overlayChrome.js.map +1 -1
- package/dist/constants/panelTabPresets.js +4 -4
- package/dist/constants/panelTabPresets.js.map +1 -1
- package/dist/constants/panelTabRegistry.d.ts +2 -2
- package/dist/constants/panelTabRegistry.d.ts.map +1 -1
- package/dist/constants/panelTabRegistry.js +8 -0
- package/dist/constants/panelTabRegistry.js.map +1 -1
- package/dist/constants/storageKeys.d.ts +8 -0
- package/dist/constants/storageKeys.d.ts.map +1 -1
- package/dist/constants/storageKeys.js +16 -0
- package/dist/constants/storageKeys.js.map +1 -1
- package/dist/hooks/replyHistoryActions.d.ts +2 -2
- package/dist/hooks/replyHistoryActions.d.ts.map +1 -1
- package/dist/hooks/replyHistoryActions.js +6 -5
- package/dist/hooks/replyHistoryActions.js.map +1 -1
- package/dist/hooks/report/assembleReportContextValue.d.ts +51 -26
- package/dist/hooks/report/assembleReportContextValue.d.ts.map +1 -1
- package/dist/hooks/report/assembleReportContextValue.js +78 -11
- package/dist/hooks/report/assembleReportContextValue.js.map +1 -1
- package/dist/hooks/report/useElementMemos.d.ts +15 -0
- package/dist/hooks/report/useElementMemos.d.ts.map +1 -0
- package/dist/hooks/report/useElementMemos.js +45 -0
- package/dist/hooks/report/useElementMemos.js.map +1 -0
- package/dist/hooks/report/useReportAuthSession.d.ts +15 -5
- package/dist/hooks/report/useReportAuthSession.d.ts.map +1 -1
- package/dist/hooks/report/useReportAuthSession.js +111 -24
- package/dist/hooks/report/useReportAuthSession.js.map +1 -1
- package/dist/hooks/report/useReportDraftSession.d.ts +11 -1
- package/dist/hooks/report/useReportDraftSession.d.ts.map +1 -1
- package/dist/hooks/report/useReportDraftSession.js +54 -1
- package/dist/hooks/report/useReportDraftSession.js.map +1 -1
- package/dist/hooks/report/useReportMarkers.d.ts +6 -7
- package/dist/hooks/report/useReportMarkers.d.ts.map +1 -1
- package/dist/hooks/report/useReportMarkers.js +73 -49
- package/dist/hooks/report/useReportMarkers.js.map +1 -1
- package/dist/hooks/report/useReportMutations.d.ts +3 -4
- package/dist/hooks/report/useReportMutations.d.ts.map +1 -1
- package/dist/hooks/report/useReportMutations.js +3 -5
- package/dist/hooks/report/useReportMutations.js.map +1 -1
- package/dist/hooks/report/useReportPanelShell.d.ts +25 -37
- package/dist/hooks/report/useReportPanelShell.d.ts.map +1 -1
- package/dist/hooks/report/useReportPanelShell.js +18 -24
- package/dist/hooks/report/useReportPanelShell.js.map +1 -1
- package/dist/hooks/report/useReportReplyReview.d.ts +18 -1
- package/dist/hooks/report/useReportReplyReview.d.ts.map +1 -1
- package/dist/hooks/report/useReportReplyReview.js +282 -6
- package/dist/hooks/report/useReportReplyReview.js.map +1 -1
- package/dist/hooks/report/useReportState.d.ts +45 -36
- package/dist/hooks/report/useReportState.d.ts.map +1 -1
- package/dist/hooks/report/useReportState.js +88 -33
- package/dist/hooks/report/useReportState.js.map +1 -1
- package/dist/hooks/useMarkerAppearancePreference.d.ts +1 -0
- package/dist/hooks/useMarkerAppearancePreference.d.ts.map +1 -1
- package/dist/hooks/useMarkerAppearancePreference.js +31 -2
- package/dist/hooks/useMarkerAppearancePreference.js.map +1 -1
- package/dist/hooks/useNetworkMonitor.d.ts +9 -0
- package/dist/hooks/useNetworkMonitor.d.ts.map +1 -0
- package/dist/hooks/useNetworkMonitor.js +26 -0
- package/dist/hooks/useNetworkMonitor.js.map +1 -0
- package/dist/hooks/useOverlayChrome.d.ts +2 -5
- package/dist/hooks/useOverlayChrome.d.ts.map +1 -1
- package/dist/hooks/useOverlayChrome.js +3 -10
- package/dist/hooks/useOverlayChrome.js.map +1 -1
- package/dist/hooks/usePanelAutoRefresh.d.ts +1 -1
- package/dist/hooks/usePanelFeedbackTransfer.js +7 -7
- package/dist/hooks/usePanelFeedbackTransfer.js.map +1 -1
- package/dist/hooks/useReportPersistence.d.ts +13 -17
- package/dist/hooks/useReportPersistence.d.ts.map +1 -1
- package/dist/hooks/useReportPersistence.js +18 -13
- package/dist/hooks/useReportPersistence.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +199 -20
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +199 -20
- package/dist/i18n/ko.js.map +1 -1
- package/dist/i18n/types.d.ts +156 -18
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/providers/ReportProvider.d.ts +1 -1
- package/dist/providers/ReportProvider.d.ts.map +1 -1
- package/dist/providers/ReportProvider.js +6 -19
- package/dist/providers/ReportProvider.js.map +1 -1
- package/dist/providers/reportContext.d.ts +183 -78
- package/dist/providers/reportContext.d.ts.map +1 -1
- package/dist/providers/reportContextPartitions.d.ts +3 -3
- package/dist/providers/reportContextPartitions.d.ts.map +1 -1
- package/dist/providers/reportContextPartitions.js +33 -9
- package/dist/providers/reportContextPartitions.js.map +1 -1
- package/dist/styles/reportStylesheet.d.ts +1 -1
- package/dist/styles/reportStylesheet.d.ts.map +1 -1
- package/dist/styles/reportStylesheet.js +1 -1
- package/dist/styles/reportStylesheet.js.map +1 -1
- package/dist/types/adapter.d.ts +66 -0
- package/dist/types/adapter.d.ts.map +1 -0
- package/dist/types/adapter.js +2 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/types/networkMonitor.d.ts +21 -0
- package/dist/types/networkMonitor.d.ts.map +1 -0
- package/dist/types/networkMonitor.js +2 -0
- package/dist/types/networkMonitor.js.map +1 -0
- package/dist/types/publicApi.d.ts +17 -5
- package/dist/types/publicApi.d.ts.map +1 -1
- package/dist/types/report-ui.d.ts +6 -1
- package/dist/types/report-ui.d.ts.map +1 -1
- package/dist/types/report.d.ts +29 -22
- package/dist/types/report.d.ts.map +1 -1
- package/dist/utils/adapter/resolveAdapter.d.ts +44 -0
- package/dist/utils/adapter/resolveAdapter.d.ts.map +1 -0
- package/dist/utils/adapter/resolveAdapter.js +178 -0
- package/dist/utils/adapter/resolveAdapter.js.map +1 -0
- package/dist/utils/auth/loginSession.d.ts +12 -0
- package/dist/utils/auth/loginSession.d.ts.map +1 -0
- package/dist/utils/auth/loginSession.js +73 -0
- package/dist/utils/auth/loginSession.js.map +1 -0
- package/dist/utils/auth/reportAuthError.d.ts +9 -0
- package/dist/utils/auth/reportAuthError.d.ts.map +1 -0
- package/dist/utils/auth/reportAuthError.js +43 -0
- package/dist/utils/auth/reportAuthError.js.map +1 -0
- package/dist/utils/auth/resolvePanelView.d.ts +14 -0
- package/dist/utils/auth/resolvePanelView.d.ts.map +1 -0
- package/dist/utils/auth/resolvePanelView.js +26 -0
- package/dist/utils/auth/resolvePanelView.js.map +1 -0
- package/dist/utils/feedback/feedbackDataTransfer.d.ts +1 -4
- package/dist/utils/feedback/feedbackDataTransfer.d.ts.map +1 -1
- package/dist/utils/feedback/feedbackDataTransfer.js +6 -6
- package/dist/utils/feedback/feedbackDataTransfer.js.map +1 -1
- package/dist/utils/feedback/formatFeedbackForAiPrompt.d.ts +51 -0
- package/dist/utils/feedback/formatFeedbackForAiPrompt.d.ts.map +1 -0
- package/dist/utils/feedback/formatFeedbackForAiPrompt.js +180 -0
- package/dist/utils/feedback/formatFeedbackForAiPrompt.js.map +1 -0
- package/dist/utils/feedback/validateFeedbackImport.d.ts.map +1 -1
- package/dist/utils/feedback/validateFeedbackImport.js +4 -0
- package/dist/utils/feedback/validateFeedbackImport.js.map +1 -1
- package/dist/utils/integration/buildAdapterIntegrationStatus.d.ts +29 -0
- package/dist/utils/integration/buildAdapterIntegrationStatus.d.ts.map +1 -0
- package/dist/utils/integration/buildAdapterIntegrationStatus.js +87 -0
- package/dist/utils/integration/buildAdapterIntegrationStatus.js.map +1 -0
- package/dist/utils/integration/integrationFeatures.d.ts +32 -0
- package/dist/utils/integration/integrationFeatures.d.ts.map +1 -0
- package/dist/utils/integration/integrationFeatures.js +101 -0
- package/dist/utils/integration/integrationFeatures.js.map +1 -0
- package/dist/utils/integration/integrationGate.d.ts +22 -0
- package/dist/utils/integration/integrationGate.d.ts.map +1 -0
- package/dist/utils/integration/integrationGate.js +11 -0
- package/dist/utils/integration/integrationGate.js.map +1 -0
- package/dist/utils/marker/coordinates.d.ts +2 -0
- package/dist/utils/marker/coordinates.d.ts.map +1 -1
- package/dist/utils/marker/coordinates.js +47 -1
- package/dist/utils/marker/coordinates.js.map +1 -1
- package/dist/utils/marker/markerContext.d.ts.map +1 -1
- package/dist/utils/marker/markerContext.js +5 -2
- package/dist/utils/marker/markerContext.js.map +1 -1
- package/dist/utils/marker/markerShape.d.ts +7 -1
- package/dist/utils/marker/markerShape.d.ts.map +1 -1
- package/dist/utils/marker/markerShape.js +11 -3
- package/dist/utils/marker/markerShape.js.map +1 -1
- package/dist/utils/marker/markerTarget.d.ts.map +1 -1
- package/dist/utils/marker/markerTarget.js +6 -0
- package/dist/utils/marker/markerTarget.js.map +1 -1
- package/dist/utils/marker/markerWindowDock.d.ts +17 -0
- package/dist/utils/marker/markerWindowDock.d.ts.map +1 -0
- package/dist/utils/marker/markerWindowDock.js +40 -0
- package/dist/utils/marker/markerWindowDock.js.map +1 -0
- package/dist/utils/marker/minimizedWindowAlias.d.ts +3 -0
- package/dist/utils/marker/minimizedWindowAlias.d.ts.map +1 -0
- package/dist/utils/marker/minimizedWindowAlias.js +50 -0
- package/dist/utils/marker/minimizedWindowAlias.js.map +1 -0
- package/dist/utils/marker/viewRestore.d.ts +14 -0
- package/dist/utils/marker/viewRestore.d.ts.map +1 -0
- package/dist/utils/marker/viewRestore.js +88 -0
- package/dist/utils/marker/viewRestore.js.map +1 -0
- package/dist/utils/memo/elementMemoMarkers.d.ts +17 -0
- package/dist/utils/memo/elementMemoMarkers.d.ts.map +1 -0
- package/dist/utils/memo/elementMemoMarkers.js +36 -0
- package/dist/utils/memo/elementMemoMarkers.js.map +1 -0
- package/dist/utils/memo/elementMemos.d.ts +15 -0
- package/dist/utils/memo/elementMemos.d.ts.map +1 -0
- package/dist/utils/memo/elementMemos.js +97 -0
- package/dist/utils/memo/elementMemos.js.map +1 -0
- package/dist/utils/network/formatApiFlowEntry.d.ts +11 -0
- package/dist/utils/network/formatApiFlowEntry.d.ts.map +1 -0
- package/dist/utils/network/formatApiFlowEntry.js +81 -0
- package/dist/utils/network/formatApiFlowEntry.js.map +1 -0
- package/dist/utils/network/networkMonitor.d.ts +12 -0
- package/dist/utils/network/networkMonitor.d.ts.map +1 -0
- package/dist/utils/network/networkMonitor.js +334 -0
- package/dist/utils/network/networkMonitor.js.map +1 -0
- package/dist/utils/network/redactNetworkPayload.d.ts +3 -0
- package/dist/utils/network/redactNetworkPayload.d.ts.map +1 -0
- package/dist/utils/network/redactNetworkPayload.js +33 -0
- package/dist/utils/network/redactNetworkPayload.js.map +1 -0
- package/dist/utils/probe/pickProbe.d.ts +1 -0
- package/dist/utils/probe/pickProbe.d.ts.map +1 -1
- package/dist/utils/probe/pickProbe.js +13 -0
- package/dist/utils/probe/pickProbe.js.map +1 -1
- package/dist/utils/probe/pickProbeLayout.d.ts +1 -1
- package/dist/utils/probe/pickProbeLayout.d.ts.map +1 -1
- package/dist/utils/probe/pickProbeLayout.js +3 -3
- package/dist/utils/probe/pickProbeLayout.js.map +1 -1
- package/dist/utils/probe/pickTargetInspect.d.ts +2 -0
- package/dist/utils/probe/pickTargetInspect.d.ts.map +1 -1
- package/dist/utils/probe/pickTargetInspect.js +14 -0
- package/dist/utils/probe/pickTargetInspect.js.map +1 -1
- package/dist/utils/report/buildDraftFromReport.d.ts.map +1 -1
- package/dist/utils/report/buildDraftFromReport.js +1 -0
- package/dist/utils/report/buildDraftFromReport.js.map +1 -1
- package/dist/utils/report/reportPosition.d.ts +1 -0
- package/dist/utils/report/reportPosition.d.ts.map +1 -1
- package/dist/utils/report/reportPosition.js +9 -0
- package/dist/utils/report/reportPosition.js.map +1 -1
- package/dist/utils/shared/dom.d.ts.map +1 -1
- package/dist/utils/shared/dom.js +5 -1
- package/dist/utils/shared/dom.js.map +1 -1
- package/dist/utils/shared/storage.d.ts +13 -30
- package/dist/utils/shared/storage.d.ts.map +1 -1
- package/dist/utils/shared/storage.js +9 -69
- package/dist/utils/shared/storage.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/overlay/FloatingPinRail.d.ts +0 -2
- package/dist/components/overlay/FloatingPinRail.d.ts.map +0 -1
- package/dist/components/overlay/FloatingPinRail.js +0 -133
- package/dist/components/overlay/FloatingPinRail.js.map +0 -1
- package/dist/components/panel/feedback/FeedbackPinToggleButton.d.ts +0 -10
- package/dist/components/panel/feedback/FeedbackPinToggleButton.d.ts.map +0 -1
- package/dist/components/panel/feedback/FeedbackPinToggleButton.js +0 -25
- package/dist/components/panel/feedback/FeedbackPinToggleButton.js.map +0 -1
- package/dist/hooks/usePinnedFeedbackPreference.d.ts +0 -13
- package/dist/hooks/usePinnedFeedbackPreference.d.ts.map +0 -1
- package/dist/hooks/usePinnedFeedbackPreference.js +0 -119
- package/dist/hooks/usePinnedFeedbackPreference.js.map +0 -1
- package/dist/types/pinnedFeedback.d.ts +0 -27
- package/dist/types/pinnedFeedback.d.ts.map +0 -1
- package/dist/types/pinnedFeedback.js +0 -2
- package/dist/types/pinnedFeedback.js.map +0 -1
- package/dist/utils/overlay/edgeDock.d.ts +0 -47
- package/dist/utils/overlay/edgeDock.d.ts.map +0 -1
- package/dist/utils/overlay/edgeDock.js +0 -144
- package/dist/utils/overlay/edgeDock.js.map +0 -1
- package/dist/utils/pinned/pinnedFeedback.d.ts +0 -18
- package/dist/utils/pinned/pinnedFeedback.d.ts.map +0 -1
- package/dist/utils/pinned/pinnedFeedback.js +0 -89
- package/dist/utils/pinned/pinnedFeedback.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
85
|
-
const
|
|
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
|
|
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
|
-
|
|
129
|
-
}, [clearHoverLeaveTimeout,
|
|
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
|
|
219
|
-
const
|
|
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
|
-
|
|
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
|
|
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
|
|
260
|
-
const
|
|
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:
|
|
271
|
-
top:
|
|
272
|
-
width:
|
|
273
|
-
|
|
274
|
-
|
|
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
|