@fivepixels-js/react 0.2.9 → 0.2.11
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 +11 -0
- package/dist/components/icons/Icons.d.ts +6 -4
- package/dist/components/icons/Icons.d.ts.map +1 -1
- package/dist/components/icons/Icons.js +7 -3
- package/dist/components/icons/Icons.js.map +1 -1
- package/dist/components/overlay/DevicePreviewChrome.d.ts.map +1 -1
- package/dist/components/overlay/DevicePreviewChrome.js +119 -167
- package/dist/components/overlay/DevicePreviewChrome.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/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/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/PanelOnboarding.d.ts.map +1 -1
- package/dist/components/panel/PanelOnboarding.js +121 -5
- package/dist/components/panel/PanelOnboarding.js.map +1 -1
- package/dist/components/panel/ReportControlPanel.d.ts.map +1 -1
- package/dist/components/panel/ReportControlPanel.js +7 -1
- 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 +27 -4
- package/dist/components/panel/ReportDraftForm.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/FeedbackListItem.d.ts.map +1 -1
- package/dist/components/panel/feedback/FeedbackListItem.js +1 -2
- 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 +16 -1
- package/dist/components/panel/feedback/FeedbackThread.js.map +1 -1
- 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 +53 -0
- package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.d.ts.map +1 -0
- package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.js +39 -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 +379 -57
- package/dist/components/point/MarkerFeedbackWindow.js.map +1 -1
- package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -1
- package/dist/components/point/ReportMarkersLayer.js +25 -28
- 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 +1 -1
- package/dist/components/report/FivePixels.d.ts.map +1 -1
- package/dist/components/report/FivePixels.js +7 -2
- package/dist/components/report/FivePixels.js.map +1 -1
- package/dist/components/report/ReportView.d.ts +1 -1
- package/dist/components/report/ReportView.d.ts.map +1 -1
- package/dist/components/report/ReportView.js +13 -9
- package/dist/components/report/ReportView.js.map +1 -1
- package/dist/components/report/index.d.ts +3 -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/FloatingWindow.d.ts +1 -0
- package/dist/components/ui/FloatingWindow.d.ts.map +1 -1
- package/dist/components/ui/FloatingWindow.js +82 -6
- package/dist/components/ui/FloatingWindow.js.map +1 -1
- package/dist/constants/loginMethod.d.ts +4 -0
- package/dist/constants/loginMethod.d.ts.map +1 -0
- package/dist/constants/loginMethod.js +5 -0
- package/dist/constants/loginMethod.js.map +1 -0
- package/dist/constants/motionClasses.d.ts +0 -9
- package/dist/constants/motionClasses.d.ts.map +1 -1
- package/dist/constants/motionClasses.js +0 -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/storageKeys.d.ts +6 -0
- package/dist/constants/storageKeys.d.ts.map +1 -1
- package/dist/constants/storageKeys.js +12 -0
- package/dist/constants/storageKeys.js.map +1 -1
- package/dist/hooks/report/assembleReportContextValue.d.ts +18 -12
- package/dist/hooks/report/assembleReportContextValue.d.ts.map +1 -1
- package/dist/hooks/report/assembleReportContextValue.js +18 -9
- package/dist/hooks/report/assembleReportContextValue.js.map +1 -1
- package/dist/hooks/report/useReportAuthSession.d.ts +14 -4
- package/dist/hooks/report/useReportAuthSession.d.ts.map +1 -1
- package/dist/hooks/report/useReportAuthSession.js +96 -24
- package/dist/hooks/report/useReportAuthSession.js.map +1 -1
- package/dist/hooks/report/useReportDraftSession.d.ts.map +1 -1
- package/dist/hooks/report/useReportDraftSession.js +14 -6
- package/dist/hooks/report/useReportDraftSession.js.map +1 -1
- package/dist/hooks/report/useReportMarkers.d.ts +4 -6
- package/dist/hooks/report/useReportMarkers.d.ts.map +1 -1
- package/dist/hooks/report/useReportMarkers.js +87 -64
- 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 +0 -8
- package/dist/hooks/report/useReportPanelShell.d.ts.map +1 -1
- package/dist/hooks/report/useReportPanelShell.js +7 -14
- 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 +23 -14
- package/dist/hooks/report/useReportState.d.ts.map +1 -1
- package/dist/hooks/report/useReportState.js +63 -16
- package/dist/hooks/report/useReportState.js.map +1 -1
- package/dist/hooks/useCurrentPathname.d.ts.map +1 -1
- package/dist/hooks/useCurrentPathname.js +10 -1
- package/dist/hooks/useCurrentPathname.js.map +1 -1
- package/dist/hooks/useDevicePreviewPreference.d.ts.map +1 -1
- package/dist/hooks/useDevicePreviewPreference.js +5 -1
- package/dist/hooks/useDevicePreviewPreference.js.map +1 -1
- 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/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +51 -19
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +51 -19
- package/dist/i18n/ko.js.map +1 -1
- package/dist/i18n/types.d.ts +50 -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 -3
- package/dist/providers/ReportProvider.js.map +1 -1
- package/dist/providers/reportContext.d.ts +93 -63
- 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 +18 -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/publicApi.d.ts +2 -2
- package/dist/types/publicApi.d.ts.map +1 -1
- package/dist/types/report-ui.d.ts +5 -0
- package/dist/types/report-ui.d.ts.map +1 -1
- package/dist/types/report.d.ts +27 -0
- package/dist/types/report.d.ts.map +1 -1
- 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/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/marker/coordinates.d.ts +1 -0
- package/dist/utils/marker/coordinates.d.ts.map +1 -1
- package/dist/utils/marker/coordinates.js +83 -24
- package/dist/utils/marker/coordinates.js.map +1 -1
- package/dist/utils/marker/locateFeedback.d.ts.map +1 -1
- package/dist/utils/marker/locateFeedback.js +6 -3
- package/dist/utils/marker/locateFeedback.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/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/targetSelector.d.ts.map +1 -1
- package/dist/utils/marker/targetSelector.js +6 -10
- package/dist/utils/marker/targetSelector.js.map +1 -1
- 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/mention/elementMentions.d.ts.map +1 -1
- package/dist/utils/mention/elementMentions.js +9 -16
- package/dist/utils/mention/elementMentions.js.map +1 -1
- package/dist/utils/overlay/devicePreviewCapture.d.ts +1 -0
- package/dist/utils/overlay/devicePreviewCapture.d.ts.map +1 -1
- package/dist/utils/overlay/devicePreviewCapture.js +12 -1
- package/dist/utils/overlay/devicePreviewCapture.js.map +1 -1
- package/dist/utils/overlay/devicePreviewFrame.d.ts +31 -0
- package/dist/utils/overlay/devicePreviewFrame.d.ts.map +1 -0
- package/dist/utils/overlay/devicePreviewFrame.js +149 -0
- package/dist/utils/overlay/devicePreviewFrame.js.map +1 -0
- package/dist/utils/overlay/pageDocumentBridge.d.ts +43 -0
- package/dist/utils/overlay/pageDocumentBridge.d.ts.map +1 -0
- package/dist/utils/overlay/pageDocumentBridge.js +208 -0
- package/dist/utils/overlay/pageDocumentBridge.js.map +1 -0
- package/dist/utils/probe/pickProbeSession.d.ts.map +1 -1
- package/dist/utils/probe/pickProbeSession.js +3 -1
- package/dist/utils/probe/pickProbeSession.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 +39 -30
- package/dist/utils/shared/dom.js.map +1 -1
- package/dist/utils/shared/pathname.d.ts.map +1 -1
- package/dist/utils/shared/pathname.js +13 -0
- package/dist/utils/shared/pathname.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 -132
- 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,13 +6,12 @@ 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
12
|
import { buildFeedbackShareUrl } from "../../utils/feedback/feedbackDeepLink.js";
|
|
13
|
-
import { CloseIcon, CheckCircleIcon, EditIcon, LinkIcon, MaximizeIcon, MinimizeIcon, RestoreIcon, SidePanelIcon } from "../../components/icons/Icons.js";
|
|
13
|
+
import { CloseIcon, CheckCircleIcon, EditIcon, LinkIcon, MaximizeIcon, MinimizeIcon, RestoreIcon, SidePanelIcon, TrashIcon } from "../../components/icons/Icons.js";
|
|
14
14
|
import { FeedbackFieldTags } from "../../components/panel/feedback/FeedbackFieldTags.js";
|
|
15
|
-
import { FeedbackPinToggleButton } from "../../components/panel/feedback/FeedbackPinToggleButton.js";
|
|
16
15
|
import { FeedbackDeleteAction } from "../../components/panel/feedback/FeedbackDeleteAction.js";
|
|
17
16
|
import { canDeleteFeedback } from "../../utils/feedback/feedbackPermissions.js";
|
|
18
17
|
import { canEditReportCases } from "../../utils/report/reportCases.js";
|
|
@@ -28,7 +27,9 @@ import { FeedbackThread } from "../../components/panel/feedback/FeedbackThread.j
|
|
|
28
27
|
import { MarkerCaseSidebar } from "./MarkerCaseSidebar.js";
|
|
29
28
|
import { ProcessingDots } from "../../components/ui/ProcessingDots.js";
|
|
30
29
|
import { Text } from "../../components/ui/Text/index.js";
|
|
31
|
-
|
|
30
|
+
import { MARKER_MINIMIZED_WINDOW_HEIGHT, MARKER_MINIMIZED_WINDOW_WIDTH, MARKER_WINDOW_MARGIN, resolveMinimizedDockIndexFromPointer, resolveMinimizedDockPosition } from "../../utils/marker/markerWindowDock.js";
|
|
31
|
+
import { readMinimizedWindowAlias, writeMinimizedWindowAlias } from "../../utils/marker/minimizedWindowAlias.js";
|
|
32
|
+
const WINDOW_MARGIN = MARKER_WINDOW_MARGIN;
|
|
32
33
|
const DEFAULT_WINDOW_SIZE = { width: 600, height: 460 };
|
|
33
34
|
const MIN_WINDOW_WIDTH = 420;
|
|
34
35
|
const MIN_WINDOW_HEIGHT = 280;
|
|
@@ -37,6 +38,14 @@ const RESOLVED_STATUS_COLOR = ACCENT_COLOR.green;
|
|
|
37
38
|
const SIDEBAR_MIN_WIDTH = 150;
|
|
38
39
|
const RIGHT_MIN_WIDTH = 280;
|
|
39
40
|
const COLLAPSED_SIDEBAR_WIDTH = 46;
|
|
41
|
+
const MINIMIZED_WINDOW_HEIGHT = MARKER_MINIMIZED_WINDOW_HEIGHT;
|
|
42
|
+
const MINIMIZED_WINDOW_WIDTH = MARKER_MINIMIZED_WINDOW_WIDTH;
|
|
43
|
+
const MINIMIZE_MORPH_MS = 420;
|
|
44
|
+
const MINIMIZE_MORPH_EASE = "cubic-bezier(0.22, 1, 0.36, 1)";
|
|
45
|
+
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}`;
|
|
46
|
+
const MINIMIZED_DOCK_SLIDE_TRANSITION = `left ${MINIMIZE_MORPH_MS}ms ${MINIMIZE_MORPH_EASE}, top ${MINIMIZE_MORPH_MS}ms ${MINIMIZE_MORPH_EASE}`;
|
|
47
|
+
const MINIMIZED_DOCK_DRAG_THRESHOLD_PX = 6;
|
|
48
|
+
const MINIMIZED_DOCK_DRAG_LIFT_PX = 10;
|
|
40
49
|
const WINDOW_CLOSE_ANIMATION_MS = 220;
|
|
41
50
|
const LEFT_SECTION_TRANSITION = "transition-[background-color,backdrop-filter] duration-200 ease-[cubic-bezier(0.22,1,0.36,1)]";
|
|
42
51
|
const LEFT_SECTION_FLAT_CLASS = `${LEFT_SECTION_TRANSITION} bg-[var(--adaptive-black50)]`;
|
|
@@ -45,6 +54,10 @@ function getLeftSectionClass(phase) {
|
|
|
45
54
|
return phase === "idle" ? LEFT_SECTION_BLUR_CLASS : LEFT_SECTION_FLAT_CLASS;
|
|
46
55
|
}
|
|
47
56
|
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)]";
|
|
57
|
+
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)]";
|
|
58
|
+
function prefersReducedMotion() {
|
|
59
|
+
return typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
60
|
+
}
|
|
48
61
|
function getViewportSize() {
|
|
49
62
|
if (typeof window === "undefined") {
|
|
50
63
|
return { width: DEFAULT_WINDOW_SIZE.width, height: DEFAULT_WINDOW_SIZE.height };
|
|
@@ -67,7 +80,62 @@ function clampSidebarWidth(width, windowWidth) {
|
|
|
67
80
|
function WindowControlButton({ onClick, ariaLabel, title, className = "", children }) {
|
|
68
81
|
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
82
|
}
|
|
70
|
-
function
|
|
83
|
+
function MinimizedCaseMarquee({ caseTexts }) {
|
|
84
|
+
if (caseTexts.length === 0) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
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))) }) }));
|
|
88
|
+
}
|
|
89
|
+
function MinimizedWindowAliasRow({ projectId, reportId, caseTexts, messages, onRestore, restoreDisabled = false, }) {
|
|
90
|
+
const [alias, setAlias] = useState(() => readMinimizedWindowAlias(projectId, reportId));
|
|
91
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
92
|
+
const [draft, setDraft] = useState(alias);
|
|
93
|
+
const inputRef = useRef(null);
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
setAlias(readMinimizedWindowAlias(projectId, reportId));
|
|
96
|
+
}, [projectId, reportId]);
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
if (!isEditing) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
inputRef.current?.focus();
|
|
102
|
+
inputRef.current?.select();
|
|
103
|
+
}, [isEditing]);
|
|
104
|
+
const commitAlias = () => {
|
|
105
|
+
const next = writeMinimizedWindowAlias(projectId, reportId, draft);
|
|
106
|
+
setAlias(next);
|
|
107
|
+
setDraft(next);
|
|
108
|
+
setIsEditing(false);
|
|
109
|
+
};
|
|
110
|
+
const clearAlias = () => {
|
|
111
|
+
writeMinimizedWindowAlias(projectId, reportId, "");
|
|
112
|
+
setAlias("");
|
|
113
|
+
setDraft("");
|
|
114
|
+
setIsEditing(false);
|
|
115
|
+
};
|
|
116
|
+
if (isEditing) {
|
|
117
|
+
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) => {
|
|
118
|
+
if (event.key === "Enter") {
|
|
119
|
+
event.preventDefault();
|
|
120
|
+
commitAlias();
|
|
121
|
+
}
|
|
122
|
+
if (event.key === "Escape") {
|
|
123
|
+
event.preventDefault();
|
|
124
|
+
setDraft(alias);
|
|
125
|
+
setIsEditing(false);
|
|
126
|
+
}
|
|
127
|
+
}, 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] }));
|
|
128
|
+
}
|
|
129
|
+
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) => {
|
|
130
|
+
event.stopPropagation();
|
|
131
|
+
setDraft(alias);
|
|
132
|
+
setIsEditing(true);
|
|
133
|
+
}, 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]" }) })] }));
|
|
134
|
+
}
|
|
135
|
+
function UnfocusedCaseSummary({ caseTexts, emptyLabel, navigateHint }) {
|
|
136
|
+
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)}`))) }))] }));
|
|
137
|
+
}
|
|
138
|
+
function MarkerWindowShareButton({ report, messages, expanded = false }) {
|
|
71
139
|
const [copied, setCopied] = useState(false);
|
|
72
140
|
const handleCopy = () => {
|
|
73
141
|
void copyTextToClipboard(buildFeedbackShareUrl(report))
|
|
@@ -79,10 +147,10 @@ function MarkerWindowShareButton({ report, messages }) {
|
|
|
79
147
|
setCopied(false);
|
|
80
148
|
});
|
|
81
149
|
};
|
|
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]" }) }));
|
|
150
|
+
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
151
|
}
|
|
84
|
-
export function MarkerFeedbackWindow({ report, anchor }) {
|
|
85
|
-
const { messages, fields, authors, pendingComposer, replyDraft, replyMentions, replyAuthorName, confirmAuthorName, showConfirmAuthorSelect, errorMessage, setErrorMessage, isUpdating, isSubmittingReply, isClaimingAssignee, focusedCaseId, selectCase,
|
|
152
|
+
export function MarkerFeedbackWindow({ report, anchor, isFocused }) {
|
|
153
|
+
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();
|
|
86
154
|
const windowRef = useRef(null);
|
|
87
155
|
const surfaceRef = useRef(null);
|
|
88
156
|
const closeRequestedRef = useRef(false);
|
|
@@ -92,6 +160,16 @@ export function MarkerFeedbackWindow({ report, anchor }) {
|
|
|
92
160
|
const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false);
|
|
93
161
|
const [size, setSize] = useState(DEFAULT_WINDOW_SIZE);
|
|
94
162
|
const [sidebarWidth, setSidebarWidth] = useState(DEFAULT_SIDEBAR_WIDTH);
|
|
163
|
+
const [isSidebarDeleteConfirming, setIsSidebarDeleteConfirming] = useState(false);
|
|
164
|
+
const [dockMorph, setDockMorph] = useState(null);
|
|
165
|
+
const [dockDrag, setDockDrag] = useState(null);
|
|
166
|
+
const dockMorphTimerRef = useRef(null);
|
|
167
|
+
const dockMorphFrameRef = useRef(null);
|
|
168
|
+
const dockDragRef = useRef(null);
|
|
169
|
+
const dockDragListenersRef = useRef(null);
|
|
170
|
+
const suppressDockRestoreClickRef = useRef(false);
|
|
171
|
+
const minimizedReplyReportIdsRef = useRef(minimizedReplyReportIds);
|
|
172
|
+
minimizedReplyReportIdsRef.current = minimizedReplyReportIds;
|
|
95
173
|
const splitStateRef = useRef(null);
|
|
96
174
|
const splitListenersRef = useRef(null);
|
|
97
175
|
const hoverRef = useNativeHover({
|
|
@@ -108,11 +186,11 @@ export function MarkerFeedbackWindow({ report, anchor }) {
|
|
|
108
186
|
hoverRef(node);
|
|
109
187
|
}, [hoverRef]);
|
|
110
188
|
const { position, handleDragHandlePointerDown } = useDraggableWindow({
|
|
111
|
-
enabled: windowMode
|
|
189
|
+
enabled: windowMode === "normal" && dockMorph === null,
|
|
112
190
|
windowRef,
|
|
113
191
|
});
|
|
114
192
|
const { isResizing, ghostRef, handleResizePointerDown } = useGhostCornerResize({
|
|
115
|
-
enabled: windowMode === "normal",
|
|
193
|
+
enabled: windowMode === "normal" && dockMorph === null,
|
|
116
194
|
targetRef: surfaceRef,
|
|
117
195
|
handleCorner: "bottom-right",
|
|
118
196
|
clampSize: clampMarkerWindowSize,
|
|
@@ -124,9 +202,9 @@ export function MarkerFeedbackWindow({ report, anchor }) {
|
|
|
124
202
|
}
|
|
125
203
|
closeFinishedRef.current = true;
|
|
126
204
|
clearHoverLeaveTimeout();
|
|
127
|
-
setHoveredMarkerId(null);
|
|
128
|
-
|
|
129
|
-
}, [clearHoverLeaveTimeout,
|
|
205
|
+
setHoveredMarkerId((current) => (current === report.id ? null : current));
|
|
206
|
+
closeReplyWindow(report.id);
|
|
207
|
+
}, [clearHoverLeaveTimeout, closeReplyWindow, report.id, setHoveredMarkerId]);
|
|
130
208
|
const requestClose = useCallback(() => {
|
|
131
209
|
if (closeRequestedRef.current) {
|
|
132
210
|
return;
|
|
@@ -155,29 +233,6 @@ export function MarkerFeedbackWindow({ report, anchor }) {
|
|
|
155
233
|
window.clearTimeout(fallbackId);
|
|
156
234
|
};
|
|
157
235
|
}, [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
236
|
const detachSplitListeners = useCallback(() => {
|
|
182
237
|
const listeners = splitListenersRef.current;
|
|
183
238
|
if (!listeners) {
|
|
@@ -189,36 +244,123 @@ export function MarkerFeedbackWindow({ report, anchor }) {
|
|
|
189
244
|
splitListenersRef.current = null;
|
|
190
245
|
}, []);
|
|
191
246
|
useEffect(() => () => detachSplitListeners(), [detachSplitListeners]);
|
|
247
|
+
const clearDockMorphTimers = useCallback(() => {
|
|
248
|
+
if (dockMorphTimerRef.current !== null) {
|
|
249
|
+
window.clearTimeout(dockMorphTimerRef.current);
|
|
250
|
+
dockMorphTimerRef.current = null;
|
|
251
|
+
}
|
|
252
|
+
if (dockMorphFrameRef.current !== null) {
|
|
253
|
+
window.cancelAnimationFrame(dockMorphFrameRef.current);
|
|
254
|
+
dockMorphFrameRef.current = null;
|
|
255
|
+
}
|
|
256
|
+
}, []);
|
|
257
|
+
const detachDockDragListeners = useCallback(() => {
|
|
258
|
+
const listeners = dockDragListenersRef.current;
|
|
259
|
+
if (!listeners) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
window.removeEventListener("pointermove", listeners.move, true);
|
|
263
|
+
window.removeEventListener("pointerup", listeners.up, true);
|
|
264
|
+
window.removeEventListener("pointercancel", listeners.up, true);
|
|
265
|
+
dockDragListenersRef.current = null;
|
|
266
|
+
}, []);
|
|
267
|
+
useEffect(() => () => clearDockMorphTimers(), [clearDockMorphTimers]);
|
|
268
|
+
useEffect(() => () => detachDockDragListeners(), [detachDockDragListeners]);
|
|
269
|
+
useEffect(() => {
|
|
270
|
+
if (!isSidebarDeleteConfirming) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const timer = window.setTimeout(() => setIsSidebarDeleteConfirming(false), 1500);
|
|
274
|
+
return () => window.clearTimeout(timer);
|
|
275
|
+
}, [isSidebarDeleteConfirming]);
|
|
276
|
+
useEffect(() => {
|
|
277
|
+
const dockMinimized = minimizedReplyReportIds.includes(report.id);
|
|
278
|
+
if (!dockMinimized && windowMode === "minimized" && dockMorph === null) {
|
|
279
|
+
setWindowMode("normal");
|
|
280
|
+
}
|
|
281
|
+
}, [dockMorph, minimizedReplyReportIds, report.id, windowMode]);
|
|
282
|
+
const isOnFeedbackPath = report.pathname === currentPathname;
|
|
283
|
+
const showFullContent = isFocused && isOnFeedbackPath;
|
|
284
|
+
const isComposingCaseInThisWindow = showFullContent && isComposingNewCase;
|
|
192
285
|
const isCreatorQuestionComposer = pendingComposer?.type === "question";
|
|
193
286
|
const showComposer = useMemo(() => {
|
|
287
|
+
if (!showFullContent) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
if (isComposingNewCase) {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
194
293
|
if (!focusedCaseId) {
|
|
195
294
|
return false;
|
|
196
295
|
}
|
|
197
296
|
return shouldShowCaseReplyComposer(report, focusedCaseId, pendingComposer);
|
|
198
|
-
}, [focusedCaseId, pendingComposer, report]);
|
|
297
|
+
}, [focusedCaseId, isComposingNewCase, pendingComposer, report, showFullContent]);
|
|
199
298
|
const replyTargetPreview = useMemo(() => {
|
|
200
|
-
if (pendingComposer?.type !== "question") {
|
|
299
|
+
if (!showFullContent || isComposingNewCase || pendingComposer?.type !== "question") {
|
|
201
300
|
return null;
|
|
202
301
|
}
|
|
203
302
|
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;
|
|
303
|
+
}, [focusedCaseId, isComposingNewCase, pendingComposer, report, showFullContent]);
|
|
304
|
+
const focusedCase = showFullContent && !isComposingNewCase && focusedCaseId ? getCaseById(report, focusedCaseId) : undefined;
|
|
305
|
+
const focusedCaseAssigneeName = showFullContent && !isComposingNewCase && focusedCaseId ? getCaseAssigneeName(report, focusedCaseId) : null;
|
|
207
306
|
const showAssigneeAssigned = Boolean(focusedCaseAssigneeName) || isClaimingAssignee;
|
|
208
307
|
const fieldTags = useMemo(() => getFieldTags(fields, report.field_values), [fields, report.field_values]);
|
|
308
|
+
const caseTexts = useMemo(() => getReportCases(report)
|
|
309
|
+
.map((caseItem) => mentionMessageToPlainText(caseItem.text, caseItem.mentions).trim())
|
|
310
|
+
.filter(Boolean), [report]);
|
|
311
|
+
const minimizedCaseTexts = useMemo(() => caseTexts.slice(0, 5), [caseTexts]);
|
|
209
312
|
const viewport = getViewportSize();
|
|
210
313
|
const maximizedSize = {
|
|
211
314
|
width: Math.max(MIN_WINDOW_WIDTH, viewport.width - WINDOW_MARGIN * 2),
|
|
212
315
|
height: Math.max(MIN_WINDOW_HEIGHT, viewport.height - WINDOW_MARGIN * 2),
|
|
213
316
|
};
|
|
214
|
-
const isMinimized = windowMode === "minimized";
|
|
317
|
+
const isMinimized = windowMode === "minimized" || dockMorph?.phase === "minimizing";
|
|
215
318
|
const isMaximized = windowMode === "maximized";
|
|
319
|
+
const showMinimizedChrome = windowMode === "minimized" && dockMorph?.phase !== "restoring";
|
|
216
320
|
const effectiveSize = isMaximized ? maximizedSize : size;
|
|
321
|
+
const minimizedWidth = Math.min(MINIMIZED_WINDOW_WIDTH, Math.max(0, viewport.width - WINDOW_MARGIN * 2));
|
|
217
322
|
const resolvedSidebarWidth = clampSidebarWidth(sidebarWidth, effectiveSize.width);
|
|
218
|
-
const
|
|
219
|
-
const
|
|
323
|
+
const minimizedDockIndex = Math.max(0, minimizedReplyReportIds.indexOf(report.id));
|
|
324
|
+
const minimizedDockCount = Math.max(1, minimizedReplyReportIds.length);
|
|
325
|
+
// Freeze the open position on mount so page changes (lost marker anchors) don't
|
|
326
|
+
// collapse every window onto the same fallback center coordinate.
|
|
327
|
+
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));
|
|
328
|
+
const restoredPosition = isMaximized ? { left: WINDOW_MARGIN, top: WINDOW_MARGIN } : (position ?? seedPosition);
|
|
329
|
+
const dockPosition = resolveMinimizedDockPosition(minimizedDockIndex, minimizedDockCount, viewport.width, viewport.height, minimizedWidth, MINIMIZED_WINDOW_HEIGHT);
|
|
330
|
+
const resolvedPosition = showMinimizedChrome ? dockPosition : restoredPosition;
|
|
331
|
+
const isDockDragging = dockDrag?.active === true;
|
|
332
|
+
const displayRect = dockMorph ?? {
|
|
333
|
+
left: dockDrag?.active ? dockDrag.pointerX - dockDrag.offsetX : resolvedPosition.left,
|
|
334
|
+
top: dockDrag?.active ? dockPosition.top - MINIMIZED_DOCK_DRAG_LIFT_PX : resolvedPosition.top,
|
|
335
|
+
width: showMinimizedChrome ? minimizedWidth : effectiveSize.width,
|
|
336
|
+
height: showMinimizedChrome ? MINIMIZED_WINDOW_HEIGHT : effectiveSize.height,
|
|
337
|
+
};
|
|
338
|
+
const layoutTransition = dockMorph
|
|
339
|
+
? MINIMIZE_MORPH_TRANSITION
|
|
340
|
+
: showMinimizedChrome && !isDockDragging
|
|
341
|
+
? MINIMIZED_DOCK_SLIDE_TRANSITION
|
|
342
|
+
: undefined;
|
|
220
343
|
const leftSectionClass = getLeftSectionClass(windowSurfacePhase);
|
|
221
344
|
const windowAnimationClass = windowSurfacePhase === "exiting" ? MOTION.markerWindowExit : windowSurfacePhase === "entering" ? `${MOTION.markerWindowEnter} pointer-events-auto` : "pointer-events-auto";
|
|
345
|
+
const runDockMorph = useCallback((phase, from, to, onComplete) => {
|
|
346
|
+
clearDockMorphTimers();
|
|
347
|
+
if (prefersReducedMotion()) {
|
|
348
|
+
setDockMorph(null);
|
|
349
|
+
onComplete?.();
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
setDockMorph({ phase, ...from });
|
|
353
|
+
dockMorphFrameRef.current = window.requestAnimationFrame(() => {
|
|
354
|
+
dockMorphFrameRef.current = window.requestAnimationFrame(() => {
|
|
355
|
+
setDockMorph({ phase, ...to });
|
|
356
|
+
dockMorphTimerRef.current = window.setTimeout(() => {
|
|
357
|
+
setDockMorph(null);
|
|
358
|
+
onComplete?.();
|
|
359
|
+
dockMorphTimerRef.current = null;
|
|
360
|
+
}, MINIMIZE_MORPH_MS + 40);
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
}, [clearDockMorphTimers]);
|
|
222
364
|
const handleSplitPointerDown = useCallback((event) => {
|
|
223
365
|
if (event.button !== 0) {
|
|
224
366
|
return;
|
|
@@ -245,32 +387,212 @@ export function MarkerFeedbackWindow({ report, anchor }) {
|
|
|
245
387
|
window.addEventListener("pointercancel", handlePointerUp, true);
|
|
246
388
|
}, [detachSplitListeners, effectiveSize.width, resolvedSidebarWidth]);
|
|
247
389
|
const handleToggleMinimize = () => {
|
|
248
|
-
|
|
390
|
+
if (dockMorph) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
const viewportSize = getViewportSize();
|
|
394
|
+
const currentMinimizedWidth = Math.min(MINIMIZED_WINDOW_WIDTH, Math.max(0, viewportSize.width - WINDOW_MARGIN * 2));
|
|
395
|
+
const currentRestoredPosition = isMaximized ? { left: WINDOW_MARGIN, top: WINDOW_MARGIN } : (position ?? seedPosition);
|
|
396
|
+
const currentRestoredSize = isMaximized
|
|
397
|
+
? {
|
|
398
|
+
width: Math.max(MIN_WINDOW_WIDTH, viewportSize.width - WINDOW_MARGIN * 2),
|
|
399
|
+
height: Math.max(MIN_WINDOW_HEIGHT, viewportSize.height - WINDOW_MARGIN * 2),
|
|
400
|
+
}
|
|
401
|
+
: size;
|
|
402
|
+
if (windowMode === "minimized") {
|
|
403
|
+
if (!isOnFeedbackPath) {
|
|
404
|
+
void revealOpenFeedback(report);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
focusReplyWindow(report.id);
|
|
408
|
+
}
|
|
409
|
+
const from = {
|
|
410
|
+
left: dockPosition.left,
|
|
411
|
+
top: dockPosition.top,
|
|
412
|
+
width: currentMinimizedWidth,
|
|
413
|
+
height: MINIMIZED_WINDOW_HEIGHT,
|
|
414
|
+
};
|
|
415
|
+
const to = {
|
|
416
|
+
left: currentRestoredPosition.left,
|
|
417
|
+
top: currentRestoredPosition.top,
|
|
418
|
+
width: currentRestoredSize.width,
|
|
419
|
+
height: currentRestoredSize.height,
|
|
420
|
+
};
|
|
421
|
+
setWindowMode("normal");
|
|
422
|
+
setReplyWindowMinimized(report.id, false);
|
|
423
|
+
if (prefersReducedMotion()) {
|
|
424
|
+
setDockMorph(null);
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
runDockMorph("restoring", from, to);
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
const nextMinimizedIds = minimizedReplyReportIds.includes(report.id) ? minimizedReplyReportIds : [...minimizedReplyReportIds, report.id];
|
|
431
|
+
const nextDockIndex = Math.max(0, nextMinimizedIds.indexOf(report.id));
|
|
432
|
+
const nextDock = resolveMinimizedDockPosition(nextDockIndex, nextMinimizedIds.length, viewportSize.width, viewportSize.height, currentMinimizedWidth, MINIMIZED_WINDOW_HEIGHT);
|
|
433
|
+
const from = {
|
|
434
|
+
left: currentRestoredPosition.left,
|
|
435
|
+
top: currentRestoredPosition.top,
|
|
436
|
+
width: currentRestoredSize.width,
|
|
437
|
+
height: currentRestoredSize.height,
|
|
438
|
+
};
|
|
439
|
+
const to = {
|
|
440
|
+
left: nextDock.left,
|
|
441
|
+
top: nextDock.top,
|
|
442
|
+
width: currentMinimizedWidth,
|
|
443
|
+
height: MINIMIZED_WINDOW_HEIGHT,
|
|
444
|
+
};
|
|
445
|
+
setReplyWindowMinimized(report.id, true);
|
|
446
|
+
if (prefersReducedMotion()) {
|
|
447
|
+
setWindowMode("minimized");
|
|
448
|
+
setDockMorph(null);
|
|
449
|
+
clearHoverLeaveTimeout();
|
|
450
|
+
setHoveredMarkerId((current) => (current === report.id ? null : current));
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
runDockMorph("minimizing", from, to, () => {
|
|
454
|
+
setWindowMode("minimized");
|
|
455
|
+
});
|
|
456
|
+
clearHoverLeaveTimeout();
|
|
457
|
+
setHoveredMarkerId((current) => (current === report.id ? null : current));
|
|
249
458
|
};
|
|
459
|
+
const handleMinimizedDockPointerDown = useCallback((event) => {
|
|
460
|
+
if (event.button !== 0 || dockMorph !== null || windowMode !== "minimized" || minimizedReplyReportIds.length < 2) {
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
event.preventDefault();
|
|
464
|
+
event.stopPropagation();
|
|
465
|
+
detachDockDragListeners();
|
|
466
|
+
const rect = windowRef.current?.getBoundingClientRect();
|
|
467
|
+
const initial = {
|
|
468
|
+
pointerId: event.pointerId,
|
|
469
|
+
startX: event.clientX,
|
|
470
|
+
startY: event.clientY,
|
|
471
|
+
offsetX: rect ? event.clientX - rect.left : minimizedWidth / 2,
|
|
472
|
+
offsetY: rect ? event.clientY - rect.top : MINIMIZED_WINDOW_HEIGHT / 2,
|
|
473
|
+
pointerX: event.clientX,
|
|
474
|
+
pointerY: event.clientY,
|
|
475
|
+
active: false,
|
|
476
|
+
};
|
|
477
|
+
dockDragRef.current = initial;
|
|
478
|
+
setDockDrag(initial);
|
|
479
|
+
const handlePointerMove = (moveEvent) => {
|
|
480
|
+
const state = dockDragRef.current;
|
|
481
|
+
if (!state || moveEvent.pointerId !== state.pointerId) {
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
const distance = Math.hypot(moveEvent.clientX - state.startX, moveEvent.clientY - state.startY);
|
|
485
|
+
const nextActive = state.active || distance >= MINIMIZED_DOCK_DRAG_THRESHOLD_PX;
|
|
486
|
+
if (nextActive && !state.active) {
|
|
487
|
+
suppressDockRestoreClickRef.current = true;
|
|
488
|
+
}
|
|
489
|
+
const next = {
|
|
490
|
+
...state,
|
|
491
|
+
pointerX: moveEvent.clientX,
|
|
492
|
+
pointerY: moveEvent.clientY,
|
|
493
|
+
active: nextActive,
|
|
494
|
+
};
|
|
495
|
+
dockDragRef.current = next;
|
|
496
|
+
setDockDrag(next);
|
|
497
|
+
if (!nextActive) {
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
const ids = minimizedReplyReportIdsRef.current;
|
|
501
|
+
const fromIndex = ids.indexOf(report.id);
|
|
502
|
+
if (fromIndex < 0 || ids.length < 2) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
const viewportWidth = window.innerWidth;
|
|
506
|
+
const itemWidth = Math.min(MINIMIZED_WINDOW_WIDTH, Math.max(0, viewportWidth - WINDOW_MARGIN * 2));
|
|
507
|
+
const centerX = moveEvent.clientX - state.offsetX + itemWidth / 2;
|
|
508
|
+
const toIndex = resolveMinimizedDockIndexFromPointer(centerX, ids.length, viewportWidth, itemWidth);
|
|
509
|
+
if (toIndex !== fromIndex) {
|
|
510
|
+
reorderMinimizedReplyWindow(report.id, toIndex);
|
|
511
|
+
}
|
|
512
|
+
};
|
|
513
|
+
const handlePointerUp = (upEvent) => {
|
|
514
|
+
const state = dockDragRef.current;
|
|
515
|
+
if (!state || upEvent.pointerId !== state.pointerId) {
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
detachDockDragListeners();
|
|
519
|
+
dockDragRef.current = null;
|
|
520
|
+
setDockDrag(null);
|
|
521
|
+
};
|
|
522
|
+
dockDragListenersRef.current = { move: handlePointerMove, up: handlePointerUp };
|
|
523
|
+
window.addEventListener("pointermove", handlePointerMove, true);
|
|
524
|
+
window.addEventListener("pointerup", handlePointerUp, true);
|
|
525
|
+
window.addEventListener("pointercancel", handlePointerUp, true);
|
|
526
|
+
}, [detachDockDragListeners, dockMorph, minimizedReplyReportIds.length, minimizedWidth, reorderMinimizedReplyWindow, report.id, windowMode]);
|
|
527
|
+
const handleMinimizedDockClickCapture = useCallback((event) => {
|
|
528
|
+
if (!suppressDockRestoreClickRef.current) {
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
event.preventDefault();
|
|
532
|
+
event.stopPropagation();
|
|
533
|
+
suppressDockRestoreClickRef.current = false;
|
|
534
|
+
}, []);
|
|
250
535
|
const handleToggleMaximize = () => {
|
|
536
|
+
if (dockMorph) {
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
if (!isOnFeedbackPath) {
|
|
540
|
+
void revealOpenFeedback(report);
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
if (!isFocused) {
|
|
544
|
+
focusReplyWindow(report.id);
|
|
545
|
+
}
|
|
251
546
|
setWindowMode((current) => (current === "maximized" ? "normal" : "maximized"));
|
|
252
547
|
};
|
|
548
|
+
const handleWindowActivate = () => {
|
|
549
|
+
if (!isOnFeedbackPath) {
|
|
550
|
+
void revealOpenFeedback(report);
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
if (!isFocused) {
|
|
554
|
+
focusReplyWindow(report.id);
|
|
555
|
+
}
|
|
556
|
+
};
|
|
557
|
+
const handleAddCase = () => {
|
|
558
|
+
beginComposeNewCase();
|
|
559
|
+
};
|
|
560
|
+
const handleSidebarDelete = () => {
|
|
561
|
+
if (!isSidebarDeleteConfirming) {
|
|
562
|
+
setIsSidebarDeleteConfirming(true);
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
void handleDelete(report.id).finally(() => setIsSidebarDeleteConfirming(false));
|
|
566
|
+
};
|
|
253
567
|
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
568
|
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
569
|
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
570
|
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;
|
|
258
571
|
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
|
|
572
|
+
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 })] }));
|
|
573
|
+
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;
|
|
574
|
+
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 }) }));
|
|
575
|
+
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
576
|
start: "var(--adaptive-black900)",
|
|
262
577
|
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) => {
|
|
578
|
+
}, 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
579
|
setReplyDraft(value);
|
|
265
580
|
if (errorMessage) {
|
|
266
581
|
setErrorMessage("");
|
|
267
582
|
}
|
|
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
|
-
|
|
583
|
+
}, 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] })] }));
|
|
584
|
+
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: {
|
|
585
|
+
left: displayRect.left,
|
|
586
|
+
top: displayRect.top,
|
|
587
|
+
width: displayRect.width,
|
|
588
|
+
height: displayRect.height,
|
|
589
|
+
...(layoutTransition ? { transition: layoutTransition } : null),
|
|
590
|
+
...(isDockDragging ? { cursor: "grabbing", transform: "scale(1.03)", willChange: "left, top, transform" } : null),
|
|
591
|
+
}, 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) => {
|
|
592
|
+
event.stopPropagation();
|
|
593
|
+
requestClose();
|
|
594
|
+
}, 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
|
|
595
|
+
? "pointer-events-none scale-90 opacity-0"
|
|
596
|
+
: "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, 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
597
|
}
|
|
276
598
|
//# sourceMappingURL=MarkerFeedbackWindow.js.map
|