@fivepixels-js/react 0.2.10 → 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 +3 -4
- package/dist/components/icons/Icons.d.ts.map +1 -1
- package/dist/components/icons/Icons.js +4 -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/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/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 +2 -2
- 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 +7 -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/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 +3 -0
- 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 +70 -48
- 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/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/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +48 -19
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +48 -19
- package/dist/i18n/ko.js.map +1 -1
- package/dist/i18n/types.d.ts +47 -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 +42 -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/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/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/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,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
|