@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.
Files changed (222) hide show
  1. package/README.md +11 -0
  2. package/dist/components/icons/Icons.d.ts +3 -4
  3. package/dist/components/icons/Icons.d.ts.map +1 -1
  4. package/dist/components/icons/Icons.js +4 -3
  5. package/dist/components/icons/Icons.js.map +1 -1
  6. package/dist/components/overlay/DotWaveOverlay.d.ts.map +1 -1
  7. package/dist/components/overlay/DotWaveOverlay.js +1 -3
  8. package/dist/components/overlay/DotWaveOverlay.js.map +1 -1
  9. package/dist/components/overlay/PickTargetHoverTooltip.d.ts.map +1 -1
  10. package/dist/components/overlay/PickTargetHoverTooltip.js +1 -1
  11. package/dist/components/overlay/PickTargetHoverTooltip.js.map +1 -1
  12. package/dist/components/panel/PanelGateShell.d.ts +2 -0
  13. package/dist/components/panel/PanelGateShell.d.ts.map +1 -1
  14. package/dist/components/panel/PanelGateShell.js +2 -0
  15. package/dist/components/panel/PanelGateShell.js.map +1 -1
  16. package/dist/components/panel/PanelOnboarding.d.ts.map +1 -1
  17. package/dist/components/panel/PanelOnboarding.js +121 -5
  18. package/dist/components/panel/PanelOnboarding.js.map +1 -1
  19. package/dist/components/panel/ReportDraftForm.d.ts.map +1 -1
  20. package/dist/components/panel/ReportDraftForm.js +27 -4
  21. package/dist/components/panel/ReportDraftForm.js.map +1 -1
  22. package/dist/components/panel/experimental/ReportMyTasksPanel.d.ts.map +1 -1
  23. package/dist/components/panel/experimental/ReportMyTasksPanel.js +3 -39
  24. package/dist/components/panel/experimental/ReportMyTasksPanel.js.map +1 -1
  25. package/dist/components/panel/feedback/FeedbackListItem.d.ts.map +1 -1
  26. package/dist/components/panel/feedback/FeedbackListItem.js +1 -2
  27. package/dist/components/panel/feedback/FeedbackListItem.js.map +1 -1
  28. package/dist/components/panel/feedback/FeedbackThread.d.ts.map +1 -1
  29. package/dist/components/panel/feedback/FeedbackThread.js +16 -1
  30. package/dist/components/panel/feedback/FeedbackThread.js.map +1 -1
  31. package/dist/components/panel/feedback/ThreadChildReply.d.ts.map +1 -1
  32. package/dist/components/panel/feedback/ThreadChildReply.js +2 -1
  33. package/dist/components/panel/feedback/ThreadChildReply.js.map +1 -1
  34. package/dist/components/panel/feedback/ThreadTimelineRow.d.ts +4 -1
  35. package/dist/components/panel/feedback/ThreadTimelineRow.d.ts.map +1 -1
  36. package/dist/components/panel/feedback/ThreadTimelineRow.js +5 -2
  37. package/dist/components/panel/feedback/ThreadTimelineRow.js.map +1 -1
  38. package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.d.ts +53 -0
  39. package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.d.ts.map +1 -0
  40. package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.js +39 -0
  41. package/dist/components/panel/onboarding/PanelOnboardingAuthSteps.js.map +1 -0
  42. package/dist/components/point/MarkerCaseSidebar.d.ts +4 -1
  43. package/dist/components/point/MarkerCaseSidebar.d.ts.map +1 -1
  44. package/dist/components/point/MarkerCaseSidebar.js +9 -8
  45. package/dist/components/point/MarkerCaseSidebar.js.map +1 -1
  46. package/dist/components/point/MarkerFeedbackWindow.d.ts +2 -1
  47. package/dist/components/point/MarkerFeedbackWindow.d.ts.map +1 -1
  48. package/dist/components/point/MarkerFeedbackWindow.js +379 -57
  49. package/dist/components/point/MarkerFeedbackWindow.js.map +1 -1
  50. package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -1
  51. package/dist/components/point/ReportMarkersLayer.js +25 -28
  52. package/dist/components/point/ReportMarkersLayer.js.map +1 -1
  53. package/dist/components/point/ReportOpenWindowsLayer.d.ts +2 -0
  54. package/dist/components/point/ReportOpenWindowsLayer.d.ts.map +1 -0
  55. package/dist/components/point/ReportOpenWindowsLayer.js +23 -0
  56. package/dist/components/point/ReportOpenWindowsLayer.js.map +1 -0
  57. package/dist/components/report/FivePixels.d.ts +1 -1
  58. package/dist/components/report/FivePixels.d.ts.map +1 -1
  59. package/dist/components/report/FivePixels.js +2 -2
  60. package/dist/components/report/FivePixels.js.map +1 -1
  61. package/dist/components/report/ReportView.d.ts.map +1 -1
  62. package/dist/components/report/ReportView.js +7 -9
  63. package/dist/components/report/ReportView.js.map +1 -1
  64. package/dist/components/report/index.d.ts +3 -1
  65. package/dist/components/report/index.d.ts.map +1 -1
  66. package/dist/components/report/index.js +2 -0
  67. package/dist/components/report/index.js.map +1 -1
  68. package/dist/constants/loginMethod.d.ts +4 -0
  69. package/dist/constants/loginMethod.d.ts.map +1 -0
  70. package/dist/constants/loginMethod.js +5 -0
  71. package/dist/constants/loginMethod.js.map +1 -0
  72. package/dist/constants/motionClasses.d.ts +0 -9
  73. package/dist/constants/motionClasses.d.ts.map +1 -1
  74. package/dist/constants/motionClasses.js +0 -9
  75. package/dist/constants/motionClasses.js.map +1 -1
  76. package/dist/constants/overlayChrome.d.ts +1 -6
  77. package/dist/constants/overlayChrome.d.ts.map +1 -1
  78. package/dist/constants/overlayChrome.js +1 -6
  79. package/dist/constants/overlayChrome.js.map +1 -1
  80. package/dist/constants/storageKeys.d.ts +6 -0
  81. package/dist/constants/storageKeys.d.ts.map +1 -1
  82. package/dist/constants/storageKeys.js +12 -0
  83. package/dist/constants/storageKeys.js.map +1 -1
  84. package/dist/hooks/report/assembleReportContextValue.d.ts +18 -12
  85. package/dist/hooks/report/assembleReportContextValue.d.ts.map +1 -1
  86. package/dist/hooks/report/assembleReportContextValue.js +18 -9
  87. package/dist/hooks/report/assembleReportContextValue.js.map +1 -1
  88. package/dist/hooks/report/useReportAuthSession.d.ts +14 -4
  89. package/dist/hooks/report/useReportAuthSession.d.ts.map +1 -1
  90. package/dist/hooks/report/useReportAuthSession.js +96 -24
  91. package/dist/hooks/report/useReportAuthSession.js.map +1 -1
  92. package/dist/hooks/report/useReportDraftSession.d.ts.map +1 -1
  93. package/dist/hooks/report/useReportDraftSession.js +3 -0
  94. package/dist/hooks/report/useReportDraftSession.js.map +1 -1
  95. package/dist/hooks/report/useReportMarkers.d.ts +4 -6
  96. package/dist/hooks/report/useReportMarkers.d.ts.map +1 -1
  97. package/dist/hooks/report/useReportMarkers.js +70 -48
  98. package/dist/hooks/report/useReportMarkers.js.map +1 -1
  99. package/dist/hooks/report/useReportMutations.d.ts +3 -4
  100. package/dist/hooks/report/useReportMutations.d.ts.map +1 -1
  101. package/dist/hooks/report/useReportMutations.js +3 -5
  102. package/dist/hooks/report/useReportMutations.js.map +1 -1
  103. package/dist/hooks/report/useReportPanelShell.d.ts +0 -8
  104. package/dist/hooks/report/useReportPanelShell.d.ts.map +1 -1
  105. package/dist/hooks/report/useReportPanelShell.js +7 -14
  106. package/dist/hooks/report/useReportPanelShell.js.map +1 -1
  107. package/dist/hooks/report/useReportReplyReview.d.ts +18 -1
  108. package/dist/hooks/report/useReportReplyReview.d.ts.map +1 -1
  109. package/dist/hooks/report/useReportReplyReview.js +282 -6
  110. package/dist/hooks/report/useReportReplyReview.js.map +1 -1
  111. package/dist/hooks/report/useReportState.d.ts +23 -14
  112. package/dist/hooks/report/useReportState.d.ts.map +1 -1
  113. package/dist/hooks/report/useReportState.js +63 -16
  114. package/dist/hooks/report/useReportState.js.map +1 -1
  115. package/dist/hooks/useOverlayChrome.d.ts +2 -5
  116. package/dist/hooks/useOverlayChrome.d.ts.map +1 -1
  117. package/dist/hooks/useOverlayChrome.js +3 -10
  118. package/dist/hooks/useOverlayChrome.js.map +1 -1
  119. package/dist/i18n/en.d.ts.map +1 -1
  120. package/dist/i18n/en.js +48 -19
  121. package/dist/i18n/en.js.map +1 -1
  122. package/dist/i18n/ko.d.ts.map +1 -1
  123. package/dist/i18n/ko.js +48 -19
  124. package/dist/i18n/ko.js.map +1 -1
  125. package/dist/i18n/types.d.ts +47 -18
  126. package/dist/i18n/types.d.ts.map +1 -1
  127. package/dist/providers/ReportProvider.d.ts +1 -1
  128. package/dist/providers/ReportProvider.d.ts.map +1 -1
  129. package/dist/providers/ReportProvider.js +6 -3
  130. package/dist/providers/ReportProvider.js.map +1 -1
  131. package/dist/providers/reportContext.d.ts +93 -63
  132. package/dist/providers/reportContext.d.ts.map +1 -1
  133. package/dist/providers/reportContextPartitions.d.ts +3 -3
  134. package/dist/providers/reportContextPartitions.d.ts.map +1 -1
  135. package/dist/providers/reportContextPartitions.js +18 -9
  136. package/dist/providers/reportContextPartitions.js.map +1 -1
  137. package/dist/styles/reportStylesheet.d.ts +1 -1
  138. package/dist/styles/reportStylesheet.d.ts.map +1 -1
  139. package/dist/styles/reportStylesheet.js +1 -1
  140. package/dist/styles/reportStylesheet.js.map +1 -1
  141. package/dist/types/publicApi.d.ts +2 -2
  142. package/dist/types/publicApi.d.ts.map +1 -1
  143. package/dist/types/report-ui.d.ts +5 -0
  144. package/dist/types/report-ui.d.ts.map +1 -1
  145. package/dist/types/report.d.ts +27 -0
  146. package/dist/types/report.d.ts.map +1 -1
  147. package/dist/utils/auth/loginSession.d.ts +12 -0
  148. package/dist/utils/auth/loginSession.d.ts.map +1 -0
  149. package/dist/utils/auth/loginSession.js +73 -0
  150. package/dist/utils/auth/loginSession.js.map +1 -0
  151. package/dist/utils/auth/reportAuthError.d.ts +9 -0
  152. package/dist/utils/auth/reportAuthError.d.ts.map +1 -0
  153. package/dist/utils/auth/reportAuthError.js +43 -0
  154. package/dist/utils/auth/reportAuthError.js.map +1 -0
  155. package/dist/utils/auth/resolvePanelView.d.ts +14 -0
  156. package/dist/utils/auth/resolvePanelView.d.ts.map +1 -0
  157. package/dist/utils/auth/resolvePanelView.js +26 -0
  158. package/dist/utils/auth/resolvePanelView.js.map +1 -0
  159. package/dist/utils/feedback/validateFeedbackImport.d.ts.map +1 -1
  160. package/dist/utils/feedback/validateFeedbackImport.js +4 -0
  161. package/dist/utils/feedback/validateFeedbackImport.js.map +1 -1
  162. package/dist/utils/marker/coordinates.d.ts +1 -0
  163. package/dist/utils/marker/coordinates.d.ts.map +1 -1
  164. package/dist/utils/marker/coordinates.js +42 -1
  165. package/dist/utils/marker/coordinates.js.map +1 -1
  166. package/dist/utils/marker/markerContext.d.ts.map +1 -1
  167. package/dist/utils/marker/markerContext.js +5 -2
  168. package/dist/utils/marker/markerContext.js.map +1 -1
  169. package/dist/utils/marker/markerTarget.d.ts.map +1 -1
  170. package/dist/utils/marker/markerTarget.js +6 -0
  171. package/dist/utils/marker/markerTarget.js.map +1 -1
  172. package/dist/utils/marker/markerWindowDock.d.ts +17 -0
  173. package/dist/utils/marker/markerWindowDock.d.ts.map +1 -0
  174. package/dist/utils/marker/markerWindowDock.js +40 -0
  175. package/dist/utils/marker/markerWindowDock.js.map +1 -0
  176. package/dist/utils/marker/minimizedWindowAlias.d.ts +3 -0
  177. package/dist/utils/marker/minimizedWindowAlias.d.ts.map +1 -0
  178. package/dist/utils/marker/minimizedWindowAlias.js +50 -0
  179. package/dist/utils/marker/minimizedWindowAlias.js.map +1 -0
  180. package/dist/utils/marker/viewRestore.d.ts +14 -0
  181. package/dist/utils/marker/viewRestore.d.ts.map +1 -0
  182. package/dist/utils/marker/viewRestore.js +88 -0
  183. package/dist/utils/marker/viewRestore.js.map +1 -0
  184. package/dist/utils/probe/pickTargetInspect.d.ts +2 -0
  185. package/dist/utils/probe/pickTargetInspect.d.ts.map +1 -1
  186. package/dist/utils/probe/pickTargetInspect.js +14 -0
  187. package/dist/utils/probe/pickTargetInspect.js.map +1 -1
  188. package/dist/utils/report/buildDraftFromReport.d.ts.map +1 -1
  189. package/dist/utils/report/buildDraftFromReport.js +1 -0
  190. package/dist/utils/report/buildDraftFromReport.js.map +1 -1
  191. package/dist/utils/report/reportPosition.d.ts +1 -0
  192. package/dist/utils/report/reportPosition.d.ts.map +1 -1
  193. package/dist/utils/report/reportPosition.js +9 -0
  194. package/dist/utils/report/reportPosition.js.map +1 -1
  195. package/dist/utils/shared/dom.d.ts.map +1 -1
  196. package/dist/utils/shared/dom.js +5 -1
  197. package/dist/utils/shared/dom.js.map +1 -1
  198. package/package.json +1 -1
  199. package/dist/components/overlay/FloatingPinRail.d.ts +0 -2
  200. package/dist/components/overlay/FloatingPinRail.d.ts.map +0 -1
  201. package/dist/components/overlay/FloatingPinRail.js +0 -133
  202. package/dist/components/overlay/FloatingPinRail.js.map +0 -1
  203. package/dist/components/panel/feedback/FeedbackPinToggleButton.d.ts +0 -10
  204. package/dist/components/panel/feedback/FeedbackPinToggleButton.d.ts.map +0 -1
  205. package/dist/components/panel/feedback/FeedbackPinToggleButton.js +0 -25
  206. package/dist/components/panel/feedback/FeedbackPinToggleButton.js.map +0 -1
  207. package/dist/hooks/usePinnedFeedbackPreference.d.ts +0 -13
  208. package/dist/hooks/usePinnedFeedbackPreference.d.ts.map +0 -1
  209. package/dist/hooks/usePinnedFeedbackPreference.js +0 -119
  210. package/dist/hooks/usePinnedFeedbackPreference.js.map +0 -1
  211. package/dist/types/pinnedFeedback.d.ts +0 -27
  212. package/dist/types/pinnedFeedback.d.ts.map +0 -1
  213. package/dist/types/pinnedFeedback.js +0 -2
  214. package/dist/types/pinnedFeedback.js.map +0 -1
  215. package/dist/utils/overlay/edgeDock.d.ts +0 -47
  216. package/dist/utils/overlay/edgeDock.d.ts.map +0 -1
  217. package/dist/utils/overlay/edgeDock.js +0 -144
  218. package/dist/utils/overlay/edgeDock.js.map +0 -1
  219. package/dist/utils/pinned/pinnedFeedback.d.ts +0 -18
  220. package/dist/utils/pinned/pinnedFeedback.d.ts.map +0 -1
  221. package/dist/utils/pinned/pinnedFeedback.js +0 -89
  222. package/dist/utils/pinned/pinnedFeedback.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState, Fragment } from "react";
3
3
  import { getMarkerDotSize } from "../../utils/marker/markerRuntime.js";
4
4
  import { useDraggableWindow, clampWindowPosition } from "../../hooks/useDraggableWindow.js";
@@ -6,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
- const WINDOW_MARGIN = 16;
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 MarkerWindowShareButton({ report, messages }) {
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, closeReplyComposer, clearHoverLeaveTimeout, scheduleHoverLeave, setHoveredMarkerId, setReplyDraft, setReplyMentions, setReplyAuthorName, setConfirmAuthorName, toggleConfirmAuthorSelect, handleReplySubmit, startDenyReview, startCheckoutReview, startAskQuestion, handleClaimAssignee, handleTransferAssignee, handleConfirmResolution, handleDelete, isDeleting, sessionActor, cancelPendingComposer, beginFeedbackEdit, } = useReport();
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 !== "maximized",
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
- closeReplyComposer();
129
- }, [clearHoverLeaveTimeout, closeReplyComposer, setHoveredMarkerId]);
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 initialPosition = useMemo(() => clampWindowPosition(anchor.left + getMarkerDotSize() / 2 - size.width / 2, anchor.top + getMarkerDotSize() / 2 - size.height / 2, size.width, size.height), [anchor.left, anchor.top, size.height, size.width]);
219
- const resolvedPosition = isMaximized ? { left: WINDOW_MARGIN, top: WINDOW_MARGIN } : (position ?? initialPosition);
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
- setWindowMode((current) => (current === "minimized" ? "normal" : "minimized"));
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 headerUtilityButtons = (_jsxs(_Fragment, { children: [shareButton, editButton, deleteButton, pinButton] }));
260
- const rightSection = (_jsxs("div", { className: "flex min-w-0 flex-1 flex-col bg-[var(--adaptive-black50)]", children: [_jsx("header", { onPointerDown: handleDragHandlePointerDown, className: "shrink-0 cursor-move touch-none select-none border-b border-[var(--adaptive-border-subtle)] px-[16px] py-[8px]", children: focusedCase ? (_jsxs(Fragment, { children: [_jsx("p", { className: "truncate text-[15px] font-semibold leading-[1.4] text-[var(--adaptive-black900)]", title: mentionMessageToPlainText(focusedCase.text, focusedCase.mentions), children: mentionMessageToPlainText(focusedCase.text, focusedCase.mentions) }), _jsxs("div", { className: "mt-[2px] flex min-w-0 items-center justify-between gap-[8px]", children: [_jsx("div", { className: "flex min-w-0 flex-1 items-center gap-[6px]", children: focusedCase.status === "resolved" ? (_jsxs(_Fragment, { children: [_jsx(CheckCircleIcon, { className: "h-[14px] w-[14px] shrink-0", fill: RESOLVED_STATUS_COLOR }), _jsx("p", { className: "min-w-0 truncate text-[12px] font-semibold leading-[1.4]", style: { color: RESOLVED_STATUS_COLOR }, children: messages.thread.issueResolvedDivider })] })) : showAssigneeAssigned ? (_jsxs(_Fragment, { children: [_jsx(ProcessingDots, {}), _jsx(Text.Shimmer, { className: "min-w-0 truncate text-[12px] leading-[1.4]", color: {
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: resolvedPosition.left,
271
- top: resolvedPosition.top,
272
- width: effectiveSize.width,
273
- ...(isMinimized ? null : { height: effectiveSize.height }),
274
- }, children: isMinimized ? (_jsxs("div", { ref: surfaceRef, className: `flex items-center justify-between gap-[8px] overflow-hidden rounded-[16px] border border-[var(--adaptive-border-subtle)] px-[10px] py-[8px] shadow-[var(--adaptive-popup-shadow)] ${leftSectionClass}`, children: [_jsx("div", { onPointerDown: handleDragHandlePointerDown, className: "flex flex-1 cursor-move touch-none select-none items-center gap-[2px]", children: leftControls }), shareButton, editButton, deleteButton, sidebarToggleButton] })) : (_jsxs("div", { ref: surfaceRef, className: "flex h-full w-full flex-row overflow-hidden rounded-[16px] shadow-[var(--adaptive-popup-shadow)] border border-[var(--adaptive-border-subtle)]", children: [isSidebarCollapsed ? (_jsxs("div", { onPointerDown: handleDragHandlePointerDown, className: `flex shrink-0 cursor-move touch-none select-none flex-col items-center gap-[2px] py-[8px] ${leftSectionClass}`, style: { width: COLLAPSED_SIDEBAR_WIDTH }, children: [leftControls, shareButton, editButton, deleteButton, pinButton, sidebarToggleButton] })) : (_jsxs("div", { className: `flex shrink-0 flex-col overflow-hidden ${leftSectionClass}`, style: { width: resolvedSidebarWidth }, children: [_jsxs("header", { onPointerDown: handleDragHandlePointerDown, className: "flex shrink-0 cursor-move touch-none select-none items-center justify-between gap-[8px] px-[10px] py-[8px]", children: [_jsx("div", { className: "flex items-center gap-[2px]", children: leftControls }), _jsxs("div", { className: "flex items-center gap-[2px]", children: [headerUtilityButtons, sidebarToggleButton] })] }), _jsx(MarkerCaseSidebar, { report: report, focusedCaseId: focusedCaseId, onSelectCase: selectCase })] })), isSidebarCollapsed ? null : (_jsx("div", { role: "separator", "aria-orientation": "vertical", onPointerDown: handleSplitPointerDown, className: "group relative w-[3px] shrink-0 cursor-col-resize touch-none self-stretch bg-[var(--adaptive-black50)] group-hover:bg-[var(--adaptive-blue500)] transition-colors", children: _jsx("span", { className: "absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-[var(--adaptive-border-subtle)] transition-colors group-hover:bg-[var(--adaptive-blue500)] touch-none pointer-events-none" }) })), rightSection, windowMode === "normal" ? (_jsx(CornerResizeHandle, { corner: "bottom-right", ariaLabel: messages.marker.resizeAriaLabel, onPointerDown: handleResizePointerDown })) : null] })) })] }));
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