@fivepixels-js/react 0.2.2 → 0.2.3

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 (189) hide show
  1. package/dist/components/icons/Icons.d.ts +9 -0
  2. package/dist/components/icons/Icons.d.ts.map +1 -1
  3. package/dist/components/icons/Icons.js +12 -0
  4. package/dist/components/icons/Icons.js.map +1 -1
  5. package/dist/components/overlay/ReportOverlayLayer.d.ts.map +1 -1
  6. package/dist/components/overlay/ReportOverlayLayer.js +3 -3
  7. package/dist/components/overlay/ReportOverlayLayer.js.map +1 -1
  8. package/dist/components/overlay/TargetHighlights.d.ts +2 -1
  9. package/dist/components/overlay/TargetHighlights.d.ts.map +1 -1
  10. package/dist/components/overlay/TargetHighlights.js +3 -2
  11. package/dist/components/overlay/TargetHighlights.js.map +1 -1
  12. package/dist/components/panel/PanelProjectFooter.d.ts.map +1 -1
  13. package/dist/components/panel/PanelProjectFooter.js +1 -4
  14. package/dist/components/panel/PanelProjectFooter.js.map +1 -1
  15. package/dist/components/panel/ReportDraftForm.d.ts.map +1 -1
  16. package/dist/components/panel/ReportDraftForm.js +48 -35
  17. package/dist/components/panel/ReportDraftForm.js.map +1 -1
  18. package/dist/components/panel/ReportImportConfirmDialog.d.ts +3 -2
  19. package/dist/components/panel/ReportImportConfirmDialog.d.ts.map +1 -1
  20. package/dist/components/panel/ReportImportConfirmDialog.js +8 -1
  21. package/dist/components/panel/ReportImportConfirmDialog.js.map +1 -1
  22. package/dist/components/panel/feedback/AssigneeThreadEntry.d.ts.map +1 -1
  23. package/dist/components/panel/feedback/AssigneeThreadEntry.js +11 -2
  24. package/dist/components/panel/feedback/AssigneeThreadEntry.js.map +1 -1
  25. package/dist/components/panel/feedback/DraftComposerToolbar.d.ts +24 -0
  26. package/dist/components/panel/feedback/DraftComposerToolbar.d.ts.map +1 -0
  27. package/dist/components/panel/feedback/DraftComposerToolbar.js +60 -0
  28. package/dist/components/panel/feedback/DraftComposerToolbar.js.map +1 -0
  29. package/dist/components/panel/feedback/FeedbackCaseEditor.d.ts +4 -1
  30. package/dist/components/panel/feedback/FeedbackCaseEditor.d.ts.map +1 -1
  31. package/dist/components/panel/feedback/FeedbackCaseEditor.js +19 -7
  32. package/dist/components/panel/feedback/FeedbackCaseEditor.js.map +1 -1
  33. package/dist/components/panel/feedback/FeedbackCategorySelector.d.ts.map +1 -1
  34. package/dist/components/panel/feedback/FeedbackCategorySelector.js +10 -7
  35. package/dist/components/panel/feedback/FeedbackCategorySelector.js.map +1 -1
  36. package/dist/components/panel/feedback/FeedbackComposer.d.ts +11 -1
  37. package/dist/components/panel/feedback/FeedbackComposer.d.ts.map +1 -1
  38. package/dist/components/panel/feedback/FeedbackComposer.js +133 -19
  39. package/dist/components/panel/feedback/FeedbackComposer.js.map +1 -1
  40. package/dist/components/panel/feedback/FeedbackDeleteAction.d.ts +16 -0
  41. package/dist/components/panel/feedback/FeedbackDeleteAction.d.ts.map +1 -0
  42. package/dist/components/panel/feedback/FeedbackDeleteAction.js +28 -0
  43. package/dist/components/panel/feedback/FeedbackDeleteAction.js.map +1 -0
  44. package/dist/components/panel/feedback/FeedbackHoverCard.d.ts.map +1 -1
  45. package/dist/components/panel/feedback/FeedbackHoverCard.js +4 -4
  46. package/dist/components/panel/feedback/FeedbackHoverCard.js.map +1 -1
  47. package/dist/components/panel/feedback/FeedbackListItem.d.ts.map +1 -1
  48. package/dist/components/panel/feedback/FeedbackListItem.js +8 -26
  49. package/dist/components/panel/feedback/FeedbackListItem.js.map +1 -1
  50. package/dist/components/panel/feedback/FeedbackThread.d.ts.map +1 -1
  51. package/dist/components/panel/feedback/FeedbackThread.js +29 -10
  52. package/dist/components/panel/feedback/FeedbackThread.js.map +1 -1
  53. package/dist/components/panel/feedback/GitIssuedThreadEntry.js +1 -1
  54. package/dist/components/panel/feedback/GitIssuedThreadEntry.js.map +1 -1
  55. package/dist/components/panel/feedback/MentionComposerInput.d.ts +17 -0
  56. package/dist/components/panel/feedback/MentionComposerInput.d.ts.map +1 -0
  57. package/dist/components/panel/feedback/MentionComposerInput.js +292 -0
  58. package/dist/components/panel/feedback/MentionComposerInput.js.map +1 -0
  59. package/dist/components/panel/feedback/MentionMessage.d.ts +9 -0
  60. package/dist/components/panel/feedback/MentionMessage.d.ts.map +1 -0
  61. package/dist/components/panel/feedback/MentionMessage.js +27 -0
  62. package/dist/components/panel/feedback/MentionMessage.js.map +1 -0
  63. package/dist/components/panel/feedback/PickTargetSnippet.d.ts +3 -2
  64. package/dist/components/panel/feedback/PickTargetSnippet.d.ts.map +1 -1
  65. package/dist/components/panel/feedback/PickTargetSnippet.js +12 -4
  66. package/dist/components/panel/feedback/PickTargetSnippet.js.map +1 -1
  67. package/dist/components/panel/feedback/ThreadAuthorMeta.d.ts.map +1 -1
  68. package/dist/components/panel/feedback/ThreadAuthorMeta.js +4 -1
  69. package/dist/components/panel/feedback/ThreadAuthorMeta.js.map +1 -1
  70. package/dist/components/panel/feedback/ThreadChildReply.d.ts.map +1 -1
  71. package/dist/components/panel/feedback/ThreadChildReply.js +2 -1
  72. package/dist/components/panel/feedback/ThreadChildReply.js.map +1 -1
  73. package/dist/components/panel/feedback/ThreadEntryActions.d.ts +3 -1
  74. package/dist/components/panel/feedback/ThreadEntryActions.d.ts.map +1 -1
  75. package/dist/components/panel/feedback/ThreadEntryActions.js +26 -6
  76. package/dist/components/panel/feedback/ThreadEntryActions.js.map +1 -1
  77. package/dist/components/point/MarkerCaseSidebar.d.ts.map +1 -1
  78. package/dist/components/point/MarkerCaseSidebar.js +8 -3
  79. package/dist/components/point/MarkerCaseSidebar.js.map +1 -1
  80. package/dist/components/point/MarkerFeedbackWindow.d.ts.map +1 -1
  81. package/dist/components/point/MarkerFeedbackWindow.js +12 -5
  82. package/dist/components/point/MarkerFeedbackWindow.js.map +1 -1
  83. package/dist/components/point/ReportDraftMarker.d.ts.map +1 -1
  84. package/dist/components/point/ReportDraftMarker.js +3 -2
  85. package/dist/components/point/ReportDraftMarker.js.map +1 -1
  86. package/dist/components/point/ReportMarkersLayer.d.ts.map +1 -1
  87. package/dist/components/point/ReportMarkersLayer.js +2 -2
  88. package/dist/components/point/ReportMarkersLayer.js.map +1 -1
  89. package/dist/components/report/ReportView.d.ts.map +1 -1
  90. package/dist/components/report/ReportView.js +4 -7
  91. package/dist/components/report/ReportView.js.map +1 -1
  92. package/dist/constants/threadActionStyles.d.ts +16 -0
  93. package/dist/constants/threadActionStyles.d.ts.map +1 -0
  94. package/dist/constants/threadActionStyles.js +52 -0
  95. package/dist/constants/threadActionStyles.js.map +1 -0
  96. package/dist/hooks/report/assembleReportContextValue.d.ts +25 -17
  97. package/dist/hooks/report/assembleReportContextValue.d.ts.map +1 -1
  98. package/dist/hooks/report/assembleReportContextValue.js +8 -2
  99. package/dist/hooks/report/assembleReportContextValue.js.map +1 -1
  100. package/dist/hooks/report/useReplyCaseEdit.d.ts +6 -1
  101. package/dist/hooks/report/useReplyCaseEdit.d.ts.map +1 -1
  102. package/dist/hooks/report/useReplyCaseEdit.js +28 -2
  103. package/dist/hooks/report/useReplyCaseEdit.js.map +1 -1
  104. package/dist/hooks/report/useReportAuthSession.d.ts +1 -1
  105. package/dist/hooks/report/useReportDraftSession.d.ts +2 -1
  106. package/dist/hooks/report/useReportDraftSession.d.ts.map +1 -1
  107. package/dist/hooks/report/useReportDraftSession.js +18 -0
  108. package/dist/hooks/report/useReportDraftSession.js.map +1 -1
  109. package/dist/hooks/report/useReportMutations.d.ts +6 -1
  110. package/dist/hooks/report/useReportMutations.d.ts.map +1 -1
  111. package/dist/hooks/report/useReportMutations.js +43 -2
  112. package/dist/hooks/report/useReportMutations.js.map +1 -1
  113. package/dist/hooks/report/useReportReplyReview.d.ts +7 -0
  114. package/dist/hooks/report/useReportReplyReview.d.ts.map +1 -1
  115. package/dist/hooks/report/useReportReplyReview.js +37 -20
  116. package/dist/hooks/report/useReportReplyReview.js.map +1 -1
  117. package/dist/hooks/report/useReportState.d.ts +6 -0
  118. package/dist/hooks/report/useReportState.d.ts.map +1 -1
  119. package/dist/hooks/report/useReportState.js +30 -1
  120. package/dist/hooks/report/useReportState.js.map +1 -1
  121. package/dist/hooks/usePanelFeedbackTransfer.d.ts +4 -4
  122. package/dist/hooks/usePanelFeedbackTransfer.d.ts.map +1 -1
  123. package/dist/hooks/usePanelFeedbackTransfer.js +24 -17
  124. package/dist/hooks/usePanelFeedbackTransfer.js.map +1 -1
  125. package/dist/i18n/en.d.ts.map +1 -1
  126. package/dist/i18n/en.js +44 -9
  127. package/dist/i18n/en.js.map +1 -1
  128. package/dist/i18n/ko.d.ts.map +1 -1
  129. package/dist/i18n/ko.js +51 -16
  130. package/dist/i18n/ko.js.map +1 -1
  131. package/dist/i18n/types.d.ts +33 -3
  132. package/dist/i18n/types.d.ts.map +1 -1
  133. package/dist/providers/reportContext.d.ts +32 -2
  134. package/dist/providers/reportContext.d.ts.map +1 -1
  135. package/dist/providers/reportContextPartitions.d.ts +1 -1
  136. package/dist/providers/reportContextPartitions.d.ts.map +1 -1
  137. package/dist/providers/reportContextPartitions.js +6 -0
  138. package/dist/providers/reportContextPartitions.js.map +1 -1
  139. package/dist/storage/local/localStorageAdapter.d.ts.map +1 -1
  140. package/dist/storage/local/localStorageAdapter.js +2 -0
  141. package/dist/storage/local/localStorageAdapter.js.map +1 -1
  142. package/dist/styles/reportStylesheet.d.ts +1 -1
  143. package/dist/styles/reportStylesheet.d.ts.map +1 -1
  144. package/dist/styles/reportStylesheet.js +1 -1
  145. package/dist/styles/reportStylesheet.js.map +1 -1
  146. package/dist/types/mention.d.ts +17 -0
  147. package/dist/types/mention.d.ts.map +1 -0
  148. package/dist/types/mention.js +11 -0
  149. package/dist/types/mention.js.map +1 -0
  150. package/dist/types/report.d.ts +4 -0
  151. package/dist/types/report.d.ts.map +1 -1
  152. package/dist/types/report.js.map +1 -1
  153. package/dist/utils/feedback/feedbackDataTransfer.d.ts +9 -2
  154. package/dist/utils/feedback/feedbackDataTransfer.d.ts.map +1 -1
  155. package/dist/utils/feedback/feedbackDataTransfer.js +24 -16
  156. package/dist/utils/feedback/feedbackDataTransfer.js.map +1 -1
  157. package/dist/utils/feedback/feedbackImportMerge.d.ts +26 -0
  158. package/dist/utils/feedback/feedbackImportMerge.d.ts.map +1 -0
  159. package/dist/utils/feedback/feedbackImportMerge.js +97 -0
  160. package/dist/utils/feedback/feedbackImportMerge.js.map +1 -0
  161. package/dist/utils/feedback/feedbackPermissions.d.ts +8 -0
  162. package/dist/utils/feedback/feedbackPermissions.d.ts.map +1 -0
  163. package/dist/utils/feedback/feedbackPermissions.js +30 -0
  164. package/dist/utils/feedback/feedbackPermissions.js.map +1 -0
  165. package/dist/utils/feedback/validateFeedbackImport.d.ts.map +1 -1
  166. package/dist/utils/feedback/validateFeedbackImport.js +1 -0
  167. package/dist/utils/feedback/validateFeedbackImport.js.map +1 -1
  168. package/dist/utils/mention/elementMentions.d.ts +39 -0
  169. package/dist/utils/mention/elementMentions.d.ts.map +1 -0
  170. package/dist/utils/mention/elementMentions.js +273 -0
  171. package/dist/utils/mention/elementMentions.js.map +1 -0
  172. package/dist/utils/mention/mentionComposerDom.d.ts +31 -0
  173. package/dist/utils/mention/mentionComposerDom.d.ts.map +1 -0
  174. package/dist/utils/mention/mentionComposerDom.js +253 -0
  175. package/dist/utils/mention/mentionComposerDom.js.map +1 -0
  176. package/dist/utils/panel/heatmapActivity.d.ts +1 -1
  177. package/dist/utils/report/buildDraftFromReport.d.ts +5 -0
  178. package/dist/utils/report/buildDraftFromReport.d.ts.map +1 -0
  179. package/dist/utils/report/buildDraftFromReport.js +33 -0
  180. package/dist/utils/report/buildDraftFromReport.js.map +1 -0
  181. package/dist/utils/shared/format.d.ts +2 -0
  182. package/dist/utils/shared/format.d.ts.map +1 -1
  183. package/dist/utils/shared/format.js +19 -0
  184. package/dist/utils/shared/format.js.map +1 -1
  185. package/package.json +1 -1
  186. package/dist/components/panel/feedback/ComposerFooterWarning.d.ts +0 -6
  187. package/dist/components/panel/feedback/ComposerFooterWarning.d.ts.map +0 -1
  188. package/dist/components/panel/feedback/ComposerFooterWarning.js +0 -6
  189. package/dist/components/panel/feedback/ComposerFooterWarning.js.map +0 -1
@@ -0,0 +1,24 @@
1
+ import type { ReportCase } from "../../../types/report.js";
2
+ import { type FeedbackCategory } from "../../../constants/feedbackCategory.js";
3
+ type DraftComposerToolbarProps = {
4
+ cases: ReportCase[];
5
+ activeCaseId: string | null;
6
+ onSelectCase: (caseId: string) => void;
7
+ onAddCase: () => void;
8
+ onRemoveCase: (caseId: string) => void;
9
+ category: FeedbackCategory | null;
10
+ onCategoryChange: (value: FeedbackCategory) => void;
11
+ categoryNeedsAttention?: boolean;
12
+ onSubmit: () => void;
13
+ isSubmitting?: boolean;
14
+ submitLabel?: string;
15
+ submittingLabel?: string;
16
+ showGitHubIssueOnCreate?: boolean;
17
+ onGitHubIssueSubmit?: () => void;
18
+ isGitHubIssueSubmitting?: boolean;
19
+ isGitHubIssueConfirming?: boolean;
20
+ onGitHubIssueConfirmingChange?: (confirming: boolean) => void;
21
+ };
22
+ export declare function DraftComposerToolbar({ cases, activeCaseId, onSelectCase, onAddCase, onRemoveCase, category, onCategoryChange, categoryNeedsAttention, onSubmit, isSubmitting, submitLabel, submittingLabel, showGitHubIssueOnCreate, onGitHubIssueSubmit, isGitHubIssueSubmitting, isGitHubIssueConfirming, onGitHubIssueConfirmingChange, }: DraftComposerToolbarProps): import("react").JSX.Element;
23
+ export {};
24
+ //# sourceMappingURL=DraftComposerToolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DraftComposerToolbar.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/DraftComposerToolbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAM7F,KAAK,yBAAyB,GAAG;IAC7B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,6BAA6B,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CACjE,CAAC;AAeF,wBAAgB,oBAAoB,CAAC,EACjC,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,sBAA8B,EAC9B,QAAQ,EACR,YAAoB,EACpB,WAAW,EACX,eAAe,EACf,uBAA+B,EAC/B,mBAAmB,EACnB,uBAA+B,EAC/B,uBAA+B,EAC/B,6BAA6B,GAChC,EAAE,yBAAyB,+BAqL3B"}
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { FEEDBACK_CATEGORIES } from "../../../constants/feedbackCategory.js";
4
+ import { ChevronDownIcon, SendIcon } from "../../../components/icons/Icons.js";
5
+ import { HoverTooltip } from "../../../components/ui/HoverTooltip.js";
6
+ import { PanelDropdownMenu, PanelDropdownMenuItem } from "../../../components/panel/PanelDropdownMenu.js";
7
+ import { useReportPreferences } from "../../../providers/reportContext.js";
8
+ const TOOLBAR_TRIGGER_CLASS = "inline-flex h-[28px] max-w-[140px] items-center gap-[4px] rounded-[8px] px-[8px] text-[12px] font-semibold text-[var(--adaptive-black600)] transition-colors hover:bg-[var(--adaptive-tintOpacity100)] hover:text-[var(--adaptive-black900)]";
9
+ function truncateLabel(text, fallback) {
10
+ const trimmed = text.trim();
11
+ if (!trimmed) {
12
+ return fallback;
13
+ }
14
+ return trimmed.length > 18 ? `${trimmed.slice(0, 18)}…` : trimmed;
15
+ }
16
+ export function DraftComposerToolbar({ cases, activeCaseId, onSelectCase, onAddCase, onRemoveCase, category, onCategoryChange, categoryNeedsAttention = false, onSubmit, isSubmitting = false, submitLabel, submittingLabel, showGitHubIssueOnCreate = false, onGitHubIssueSubmit, isGitHubIssueSubmitting = false, isGitHubIssueConfirming = false, onGitHubIssueConfirmingChange, }) {
17
+ const { messages } = useReportPreferences();
18
+ const [casesOpen, setCasesOpen] = useState(false);
19
+ const [categoryOpen, setCategoryOpen] = useState(false);
20
+ const isActionDisabled = isSubmitting || isGitHubIssueSubmitting;
21
+ const resolvedSubmitLabel = submitLabel ?? messages.composer.draftComplete;
22
+ const resolvedSubmittingLabel = submittingLabel ?? messages.composer.draftCompleting;
23
+ const activeCaseIndex = Math.max(0, cases.findIndex((item) => item.id === activeCaseId));
24
+ const activeCase = cases[activeCaseIndex] ?? cases[0] ?? null;
25
+ const casesLabel = activeCase ? truncateLabel(activeCase.text, messages.composer.caseTabLabel(activeCaseIndex + 1)) : messages.composer.casesDropdownLabel;
26
+ const categoryLabel = category ? messages.composer.categoryOption[category] : messages.composer.categoryLabel;
27
+ const handleGitHubIssueClick = () => {
28
+ if (isActionDisabled || !onGitHubIssueSubmit) {
29
+ return;
30
+ }
31
+ if (!isGitHubIssueConfirming) {
32
+ onGitHubIssueConfirmingChange?.(true);
33
+ return;
34
+ }
35
+ onGitHubIssueConfirmingChange?.(false);
36
+ onGitHubIssueSubmit();
37
+ };
38
+ return (_jsxs("div", { className: "flex shrink-0 items-center gap-[6px] px-[8px] py-[6px]", children: [_jsx(HoverTooltip, { label: messages.composer.addCase, children: _jsx("button", { type: "button", "data-fivepixels-interactive": "", onClick: onAddCase, disabled: isActionDisabled, "aria-label": messages.composer.addCaseTabAriaLabel, className: "inline-flex h-[28px] w-[28px] shrink-0 items-center justify-center rounded-[8px] text-[18px] font-medium leading-none text-[var(--adaptive-black600)] transition-colors hover:bg-[var(--adaptive-tintOpacity100)] hover:text-[var(--adaptive-black900)] disabled:opacity-50", children: "+" }) }), _jsx("span", { className: "h-[14px] w-px shrink-0 bg-[var(--adaptive-border-subtle)]", "aria-hidden": true }), _jsx(PanelDropdownMenu, { open: casesOpen, onClose: () => setCasesOpen(false), align: "left", menuClassName: "min-w-[180px] rounded-[10px]", trigger: _jsxs("button", { type: "button", "data-fivepixels-interactive": "", "aria-expanded": casesOpen, "aria-label": messages.composer.casesDropdownAriaLabel, disabled: isActionDisabled, onClick: () => {
39
+ setCategoryOpen(false);
40
+ setCasesOpen((current) => !current);
41
+ }, className: `${TOOLBAR_TRIGGER_CLASS} disabled:opacity-50`, children: [_jsx("span", { className: "min-w-0 truncate", children: casesLabel }), _jsx(ChevronDownIcon, { className: "h-[12px] w-[12px] shrink-0" })] }), children: cases.map((item, index) => {
42
+ const isActive = item.id === activeCaseId;
43
+ return (_jsxs("div", { className: "flex items-stretch", children: [_jsx(PanelDropdownMenuItem, { active: isActive, onClick: () => {
44
+ onSelectCase(item.id);
45
+ setCasesOpen(false);
46
+ }, children: _jsx("span", { className: "min-w-0 flex-1 truncate", children: truncateLabel(item.text, messages.composer.caseTabLabel(index + 1)) }) }), cases.length > 1 ? (_jsx("button", { type: "button", "data-fivepixels-interactive": "", onClick: () => {
47
+ onRemoveCase(item.id);
48
+ if (cases.length <= 2) {
49
+ setCasesOpen(false);
50
+ }
51
+ }, "aria-label": messages.composer.removeCaseAriaLabel(index + 1), className: "inline-flex w-[28px] shrink-0 items-center justify-center text-[14px] text-[var(--adaptive-black500)] hover:bg-[var(--adaptive-black100)] hover:text-[var(--adaptive-black900)]", children: "\u00D7" })) : null] }, item.id));
52
+ }) }), _jsx(PanelDropdownMenu, { open: categoryOpen, onClose: () => setCategoryOpen(false), align: "left", menuClassName: "min-w-[140px] rounded-[10px]", trigger: _jsxs("button", { type: "button", "data-fivepixels-interactive": "", "aria-expanded": categoryOpen, "aria-label": messages.composer.categoryAriaLabel, "aria-invalid": categoryNeedsAttention || undefined, disabled: isActionDisabled, onClick: () => {
53
+ setCasesOpen(false);
54
+ setCategoryOpen((current) => !current);
55
+ }, className: `${TOOLBAR_TRIGGER_CLASS} disabled:opacity-50 ` + (categoryNeedsAttention ? "fivepixels-validation-attention text-rose-500 hover:text-rose-600" : ""), children: [_jsx("span", { className: "min-w-0 truncate", children: categoryLabel }), _jsx(ChevronDownIcon, { className: "h-[12px] w-[12px] shrink-0" })] }), children: FEEDBACK_CATEGORIES.map((item) => (_jsx(PanelDropdownMenuItem, { active: category === item, onClick: () => {
56
+ onCategoryChange(item);
57
+ setCategoryOpen(false);
58
+ }, children: messages.composer.categoryOption[item] }, item))) }), _jsx("div", { className: "min-w-[8px] flex-1" }), showGitHubIssueOnCreate && onGitHubIssueSubmit ? (_jsxs("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: handleGitHubIssueClick, className: "inline-flex h-[28px] items-center justify-center rounded-full border border-[var(--adaptive-border-subtle)] px-[10px] text-[12px] font-semibold text-[var(--adaptive-black500)] disabled:opacity-50", "aria-label": isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmAriaLabel : messages.composer.gitIssueSendAriaLabel, title: isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmTitle : messages.composer.gitIssueSendTitle, children: ["+ ", isGitHubIssueSubmitting ? messages.composer.gitIssueSendingLabel : isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmLabel : messages.composer.gitIssueSendLabel] })) : null, _jsx(HoverTooltip, { label: resolvedSubmitLabel, disabled: isActionDisabled, children: _jsx("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: onSubmit, className: "inline-flex h-[32px] w-[32px] shrink-0 items-center justify-center rounded-full bg-[var(--adaptive-black900)] text-[var(--adaptive-black50)] disabled:opacity-50", "aria-label": isSubmitting ? resolvedSubmittingLabel : resolvedSubmitLabel, children: _jsx(SendIcon, { className: "h-[14px] w-[14px]" }) }) })] }));
59
+ }
60
+ //# sourceMappingURL=DraftComposerToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DraftComposerToolbar.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/DraftComposerToolbar.tsx"],"names":[],"mappings":"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"}
@@ -9,7 +9,10 @@ type FeedbackCaseEditorProps = {
9
9
  needsAttention?: boolean;
10
10
  attentionKey?: number;
11
11
  emptyCaseIds?: string[];
12
+ showTabBar?: boolean;
13
+ activeCaseId?: string | null;
14
+ onActiveCaseIdChange?: (caseId: string) => void;
12
15
  };
13
- export declare function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCase, autoFocus, onSubmitShortcut, needsAttention, attentionKey, emptyCaseIds, }: FeedbackCaseEditorProps): import("react").JSX.Element | null;
16
+ export declare function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCase, autoFocus, onSubmitShortcut, needsAttention, attentionKey, emptyCaseIds, showTabBar, activeCaseId: controlledActiveCaseId, onActiveCaseIdChange, }: FeedbackCaseEditorProps): import("react").JSX.Element | null;
14
17
  export {};
15
18
  //# sourceMappingURL=FeedbackCaseEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackCaseEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCaseEditor.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,KAAK,uBAAuB,GAAG;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAmFF,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,SAAiB,EACjB,gBAAgB,EAChB,cAAsB,EACtB,YAAgB,EAChB,YAAiB,GACpB,EAAE,uBAAuB,sCAgHzB"}
1
+ {"version":3,"file":"FeedbackCaseEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCaseEditor.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,KAAK,uBAAuB,GAAG;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAC;AAmFF,wBAAgB,kBAAkB,CAAC,EAC/B,KAAK,EACL,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,SAAiB,EACjB,gBAAgB,EAChB,cAAsB,EACtB,YAAgB,EAChB,YAAiB,EACjB,UAAiB,EACjB,YAAY,EAAE,sBAAsB,EACpC,oBAAoB,GACvB,EAAE,uBAAuB,sCAqIzB"}
@@ -46,11 +46,23 @@ function resolveActiveCaseId(cases, activeCaseId) {
46
46
  }
47
47
  return cases[cases.length - 1]?.id ?? cases[0].id;
48
48
  }
49
- export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCase, autoFocus = false, onSubmitShortcut, needsAttention = false, attentionKey = 0, emptyCaseIds = [], }) {
49
+ export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCase, autoFocus = false, onSubmitShortcut, needsAttention = false, attentionKey = 0, emptyCaseIds = [], showTabBar = true, activeCaseId: controlledActiveCaseId, onActiveCaseIdChange, }) {
50
50
  const { messages } = useReportPreferences();
51
51
  const previousCaseCountRef = useRef(cases.length);
52
52
  const containerRef = useRef(null);
53
- const [activeCaseId, setActiveCaseId] = useState(() => cases[0]?.id ?? null);
53
+ const [uncontrolledActiveCaseId, setUncontrolledActiveCaseId] = useState(() => cases[0]?.id ?? null);
54
+ const isActiveCaseControlled = controlledActiveCaseId !== undefined;
55
+ const activeCaseId = isActiveCaseControlled ? controlledActiveCaseId : uncontrolledActiveCaseId;
56
+ const setActiveCaseId = useCallback((caseId) => {
57
+ if (!caseId) {
58
+ return;
59
+ }
60
+ if (isActiveCaseControlled) {
61
+ onActiveCaseIdChange?.(caseId);
62
+ return;
63
+ }
64
+ setUncontrolledActiveCaseId(caseId);
65
+ }, [isActiveCaseControlled, onActiveCaseIdChange]);
54
66
  const resolvedActiveCaseId = resolveActiveCaseId(cases, activeCaseId);
55
67
  const activeCase = cases.find((item) => item.id === resolvedActiveCaseId) ?? null;
56
68
  const activeCaseIndex = activeCase ? cases.findIndex((item) => item.id === activeCase.id) : -1;
@@ -58,10 +70,10 @@ export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCas
58
70
  const getCaseInputPlaceholder = useCallback((index) => messages.composer.caseInputPlaceholder(index), [messages.composer]);
59
71
  useEffect(() => {
60
72
  const nextActiveCaseId = resolveActiveCaseId(cases, activeCaseId);
61
- if (nextActiveCaseId !== activeCaseId) {
73
+ if (nextActiveCaseId && nextActiveCaseId !== activeCaseId) {
62
74
  setActiveCaseId(nextActiveCaseId);
63
75
  }
64
- }, [activeCaseId, cases]);
76
+ }, [activeCaseId, cases, setActiveCaseId]);
65
77
  useEffect(() => {
66
78
  if (cases.length <= previousCaseCountRef.current) {
67
79
  previousCaseCountRef.current = cases.length;
@@ -75,7 +87,7 @@ export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCas
75
87
  });
76
88
  }
77
89
  previousCaseCountRef.current = cases.length;
78
- }, [cases]);
90
+ }, [cases, setActiveCaseId]);
79
91
  useEffect(() => {
80
92
  if (!needsAttention || attentionKey <= 0 || emptyCaseIds.length === 0) {
81
93
  return;
@@ -91,7 +103,7 @@ export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCas
91
103
  window.requestAnimationFrame(() => {
92
104
  document.getElementById(`fivepixels-case-input-${targetCaseId}`)?.focus();
93
105
  });
94
- }, [needsAttention, attentionKey, emptyCaseIds, resolvedActiveCaseId]);
106
+ }, [needsAttention, attentionKey, emptyCaseIds, resolvedActiveCaseId, setActiveCaseId]);
95
107
  const handleRemoveCase = (caseId) => {
96
108
  const removeIndex = cases.findIndex((item) => item.id === caseId);
97
109
  if (removeIndex < 0) {
@@ -106,6 +118,6 @@ export function FeedbackCaseEditor({ cases, onCaseChange, onAddCase, onRemoveCas
106
118
  if (!activeCase || activeCaseIndex < 0) {
107
119
  return null;
108
120
  }
109
- return (_jsxs("div", { ref: containerRef, className: "flex h-full min-h-0 flex-1 flex-col", children: [_jsx(FeedbackCaseTabBar, { variant: "editor", cases: cases, activeCaseId: resolvedActiveCaseId, onSelectCase: setActiveCaseId, onAddCase: onAddCase, onRemoveCase: handleRemoveCase, invalidCaseIds: needsAttention ? emptyCaseIds : [] }), _jsx("div", { role: "tabpanel", id: `fivepixels-case-panel-${activeCase.id}`, "aria-labelledby": `fivepixels-case-tab-${activeCase.id}`, className: "flex min-h-0 flex-1 flex-col overflow-y-auto px-[4px] py-[4px]", children: _jsx(CaseTextarea, { id: `fivepixels-case-input-${activeCase.id}`, autoFocus: autoFocus && activeCaseIndex === 0, value: activeCase.text, placeholder: getCaseInputPlaceholder(activeCaseIndex + 1), onChange: (text) => onCaseChange(activeCase.id, text), onSubmitShortcut: onSubmitShortcut, needsAttention: activeCaseNeedsAttention }) })] }));
121
+ return (_jsxs("div", { ref: containerRef, className: "flex h-full min-h-0 flex-1 flex-col", children: [showTabBar ? (_jsx(FeedbackCaseTabBar, { variant: "editor", cases: cases, activeCaseId: resolvedActiveCaseId, onSelectCase: setActiveCaseId, onAddCase: onAddCase, onRemoveCase: handleRemoveCase, invalidCaseIds: needsAttention ? emptyCaseIds : [] })) : null, _jsx("div", { role: "tabpanel", id: `fivepixels-case-panel-${activeCase.id}`, "aria-labelledby": `fivepixels-case-tab-${activeCase.id}`, className: "flex min-h-0 flex-1 flex-col overflow-y-auto px-[4px] py-[4px]", children: _jsx(CaseTextarea, { id: `fivepixels-case-input-${activeCase.id}`, autoFocus: autoFocus && activeCaseIndex === 0, value: activeCase.text, placeholder: getCaseInputPlaceholder(activeCaseIndex + 1), onChange: (text) => onCaseChange(activeCase.id, text), onSubmitShortcut: onSubmitShortcut, needsAttention: activeCaseNeedsAttention }) })] }));
110
122
  }
111
123
  //# sourceMappingURL=FeedbackCaseEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackCaseEditor.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCaseEditor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FeedbackCaseEditor.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCaseEditor.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackCategorySelector.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCategorySelector.tsx"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,KAAK,6BAA6B,GAAG;IACjC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAsB,EAAE,YAAgB,EAAE,EAAE,6BAA6B,+BAkD9I"}
1
+ {"version":3,"file":"FeedbackCategorySelector.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCategorySelector.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,KAAK,6BAA6B,GAAG;IACjC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAsB,EAAE,YAAgB,EAAE,EAAE,6BAA6B,+BAyD9I"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect, useRef } from "react";
3
+ import { HoverTooltip } from "../../../components/ui/HoverTooltip.js";
3
4
  import { FEEDBACK_CATEGORIES } from "../../../constants/feedbackCategory.js";
4
5
  export function FeedbackCategorySelector({ value, onChange, messages, needsAttention = false, attentionKey = 0 }) {
5
6
  const containerRef = useRef(null);
@@ -11,15 +12,17 @@ export function FeedbackCategorySelector({ value, onChange, messages, needsAtten
11
12
  containerRef.current?.scrollIntoView({ behavior: "smooth", block: "nearest" });
12
13
  firstButtonRef.current?.focus();
13
14
  }, [needsAttention, attentionKey]);
14
- return (_jsx("div", { ref: containerRef, className: "flex flex-wrap items-center gap-[4px] border-t border-[var(--adaptive-tintOpacity100)] p-[4px] transition-[box-shadow,background-color] duration-200 " +
15
+ return (_jsx("div", { ref: containerRef, className:
16
+ // "flex flex-wrap items-center gap-[4px] border-t border-[var(--adaptive-tintOpacity100)] p-[4px] transition-[box-shadow,background-color] duration-200 " +
17
+ "flex flex-wrap items-center gap-[4px] p-[4px] transition-[box-shadow,background-color] duration-200 " +
15
18
  (needsAttention ? "fivepixels-validation-attention rounded-b-[12px] bg-rose-500/10" : ""), role: "group", "aria-label": messages.composer.categoryAriaLabel, "aria-invalid": needsAttention || undefined, children: FEEDBACK_CATEGORIES.map((category, index) => {
16
19
  const selected = value === category;
17
- return (_jsx("button", { ref: index === 0 ? firstButtonRef : undefined, type: "button", "data-fivepixels-interactive": "", "aria-pressed": selected, onClick: () => onChange(category), className: "rounded-[8px] border px-[12px] py-[4px] text-[12px] font-semibold " +
18
- (selected
19
- ? "border-[var(--adaptive-border-subtle)] bg-[var(--adaptive-surface-inverse)] text-[var(--adaptive-text-inverse)]"
20
- : needsAttention
21
- ? "border-rose-400 text-[var(--adaptive-text-primary)]"
22
- : "border-[var(--adaptive-border-subtle)] text-[var(--adaptive-text-muted)]"), children: messages.composer.categoryOption[category] }, category));
20
+ return (_jsx(HoverTooltip, { label: messages.composer.categoryTooltip[category], multiline: true, children: _jsx("button", { ref: index === 0 ? firstButtonRef : undefined, type: "button", "data-fivepixels-interactive": "", "aria-pressed": selected, "aria-label": `${messages.composer.categoryOption[category]}. ${messages.composer.categoryTooltip[category]}`, onClick: () => onChange(category), className: "rounded-[8px] border px-[12px] py-[4px] text-[12px] font-semibold " +
21
+ (selected
22
+ ? "border-[var(--adaptive-border-subtle)] bg-[var(--adaptive-surface-inverse)] text-[var(--adaptive-text-inverse)]"
23
+ : needsAttention
24
+ ? "border-rose-400 text-[var(--adaptive-text-primary)]"
25
+ : "border-[var(--adaptive-border-subtle)] text-[var(--adaptive-text-muted)]"), children: messages.composer.categoryOption[category] }) }, category));
23
26
  }) }));
24
27
  }
25
28
  //# sourceMappingURL=FeedbackCategorySelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackCategorySelector.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCategorySelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAyB,MAAM,iCAAiC,CAAC;AAW7F,MAAM,UAAU,wBAAwB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,KAAK,EAAE,YAAY,GAAG,CAAC,EAAiC;IAC3I,MAAM,YAAY,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,cAAc,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO;QACX,CAAC;QAED,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/E,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnC,OAAO,CACH,cACI,GAAG,EAAE,YAAY,EACjB,SAAS,EACL,uJAAuJ;YACvJ,CAAC,cAAc,CAAC,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,EAAE,CAAC,EAE7F,IAAI,EAAC,OAAO,gBACA,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,kBACjC,cAAc,IAAI,SAAS,YAExC,mBAAmB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACzC,MAAM,QAAQ,GAAG,KAAK,KAAK,QAAQ,CAAC;YAEpC,OAAO,CACH,iBAEI,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAC7C,IAAI,EAAC,QAAQ,iCACe,EAAE,kBAChB,QAAQ,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,SAAS,EACL,oEAAoE;oBACpE,CAAC,QAAQ;wBACL,CAAC,CAAC,iHAAiH;wBACnH,CAAC,CAAC,cAAc;4BACd,CAAC,CAAC,qDAAqD;4BACvD,CAAC,CAAC,0EAA0E,CAAC,YAGtF,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,IAftC,QAAQ,CAgBR,CACZ,CAAC;QACN,CAAC,CAAC,GACA,CACT,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"FeedbackCategorySelector.js","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackCategorySelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAyB,MAAM,iCAAiC,CAAC;AAW7F,MAAM,UAAU,wBAAwB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,KAAK,EAAE,YAAY,GAAG,CAAC,EAAiC;IAC3I,MAAM,YAAY,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,cAAc,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO;QACX,CAAC;QAED,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/E,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnC,OAAO,CACH,cACI,GAAG,EAAE,YAAY,EACjB,SAAS;QACL,4JAA4J;QAC5J,sGAAsG;YACtG,CAAC,cAAc,CAAC,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,EAAE,CAAC,EAE7F,IAAI,EAAC,OAAO,gBACA,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,kBACjC,cAAc,IAAI,SAAS,YAExC,mBAAmB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACzC,MAAM,QAAQ,GAAG,KAAK,KAAK,QAAQ,CAAC;YAEpC,OAAO,CACH,KAAC,YAAY,IAET,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,EAClD,SAAS,kBAET,iBACI,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAC7C,IAAI,EAAC,QAAQ,iCACe,EAAE,kBAChB,QAAQ,gBACV,GAAG,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,EAC3G,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,SAAS,EACL,oEAAoE;wBACpE,CAAC,QAAQ;4BACL,CAAC,CAAC,iHAAiH;4BACnH,CAAC,CAAC,cAAc;gCACd,CAAC,CAAC,qDAAqD;gCACvD,CAAC,CAAC,0EAA0E,CAAC,YAGtF,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,GACtC,IArBJ,QAAQ,CAsBF,CAClB,CAAC;QACN,CAAC,CAAC,GACA,CACT,CAAC;AACN,CAAC"}
@@ -1,9 +1,14 @@
1
1
  import type { ReportField, ReportFieldValues, ReportCase } from "../../../types/report.js";
2
2
  import type { ReportAuthor } from "../../../types/report.js";
3
3
  import type { FeedbackCategory } from "../../../constants/feedbackCategory.js";
4
+ import type { ElementMention } from "../../../types/mention.js";
5
+ export type ComposerMode = "deny" | "recheck" | "checkout" | "question";
4
6
  type FeedbackComposerProps = {
5
7
  message?: string;
6
8
  onMessageChange?: (value: string) => void;
9
+ mentions?: ElementMention[];
10
+ onMentionsChange?: (mentions: ElementMention[]) => void;
11
+ enableElementMentions?: boolean;
7
12
  cases?: ReportCase[];
8
13
  onCaseChange?: (caseId: string, text: string) => void;
9
14
  onAddCase?: () => void;
@@ -30,6 +35,8 @@ type FeedbackComposerProps = {
30
35
  askQuestionChecked?: boolean;
31
36
  onAskQuestionChange?: (checked: boolean) => void;
32
37
  askQuestionForced?: boolean;
38
+ composerMode?: ComposerMode | null;
39
+ onCancelComposerMode?: () => void;
33
40
  hideAuthorSelector?: boolean;
34
41
  lockedAuthorName?: string;
35
42
  onFooterWarningChange?: (message: string | null) => void;
@@ -37,7 +44,10 @@ type FeedbackComposerProps = {
37
44
  hideActions?: boolean;
38
45
  hidePrimarySubmitAction?: boolean;
39
46
  categoryPrompt?: string;
47
+ showCaseTabBar?: boolean;
48
+ activeCaseId?: string | null;
49
+ onActiveCaseIdChange?: (caseId: string) => void;
40
50
  };
41
- export declare function FeedbackComposer({ message, onMessageChange, cases, onCaseChange, onAddCase, onRemoveCase, authorName, onAuthorNameChange, authors, fields: _fields, fieldValues: _fieldValues, onFieldChange: _onFieldChange, category, onCategoryChange, showCategory, showTags: _showTags, onSubmit, isSubmitting, showGitHubIssueOnCreate, onGitHubIssueSubmit, isGitHubIssueSubmitting, placeholder, autoFocus, errorMessage, showAskQuestionToggle, askQuestionChecked, onAskQuestionChange, askQuestionForced, hideAuthorSelector, lockedAuthorName, onFooterWarningChange, hideEditor, hideActions, hidePrimarySubmitAction, categoryPrompt, }: FeedbackComposerProps): import("react").JSX.Element;
51
+ export declare function FeedbackComposer({ message, onMessageChange, mentions, onMentionsChange, enableElementMentions, cases, onCaseChange, onAddCase, onRemoveCase, authorName, onAuthorNameChange, authors, fields: _fields, fieldValues: _fieldValues, onFieldChange: _onFieldChange, category, onCategoryChange, showCategory, showTags: _showTags, onSubmit, isSubmitting, showGitHubIssueOnCreate, onGitHubIssueSubmit, isGitHubIssueSubmitting, placeholder, autoFocus, errorMessage, showAskQuestionToggle, askQuestionChecked, onAskQuestionChange, askQuestionForced, composerMode, onCancelComposerMode, hideAuthorSelector, lockedAuthorName, onFooterWarningChange, hideEditor, hideActions, hidePrimarySubmitAction, categoryPrompt, showCaseTabBar, activeCaseId, onActiveCaseIdChange, }: FeedbackComposerProps): import("react").JSX.Element;
42
52
  export {};
43
53
  //# sourceMappingURL=FeedbackComposer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackComposer.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackComposer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FeedbackComposer.d.ts","sourceRoot":"","sources":["../../../../src/components/panel/feedback/FeedbackComposer.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useMemo, useState } from "react";
2
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
3
3
  import { useReportPreferences } from "../../../providers/reportContext.js";
4
- import { SendIcon } from "../../../components/icons/Icons.js";
4
+ import { CloseIcon, AskActionIcon, DeniedActionIcon, CompleteActionIcon, SendIcon } from "../../../components/icons/Icons.js";
5
5
  import { HoverTooltip } from "../../../components/ui/HoverTooltip.js";
6
6
  import { FeedbackCategorySelector } from "./FeedbackCategorySelector.js";
7
7
  import { FeedbackCaseEditor } from "./FeedbackCaseEditor.js";
8
+ import { MentionComposerInput } from "./MentionComposerInput.js";
9
+ import { resolveComposerModeActionKind, THREAD_ACTION_STYLE } from "../../../constants/threadActionStyles.js";
10
+ const REPLY_TEXTAREA_MIN_HEIGHT = 32;
11
+ const REPLY_TEXTAREA_MAX_HEIGHT = 200;
12
+ const REPLY_LINE_HEIGHT_PX = 21;
13
+ const COMPOSER_MODE_TAG_INLINE_RESERVE_PX = 96;
14
+ const REPLY_MEASURE_ROOT_ATTR = "data-reply-measure-root";
8
15
  function isCaseTextErrorMessage(errorMessage, caseCount, caseTextRequired, casesRequired) {
9
16
  if (!errorMessage) {
10
17
  return false;
@@ -19,20 +26,121 @@ function isCaseTextErrorMessage(errorMessage, caseCount, caseTextRequired, cases
19
26
  }
20
27
  return false;
21
28
  }
22
- export function FeedbackComposer({ message = "", onMessageChange, cases, onCaseChange, onAddCase, onRemoveCase, authorName, onAuthorNameChange, authors, fields: _fields, fieldValues: _fieldValues, onFieldChange: _onFieldChange, category = null, onCategoryChange, showCategory = false, showTags: _showTags = false, onSubmit, isSubmitting = false, showGitHubIssueOnCreate = false, onGitHubIssueSubmit, isGitHubIssueSubmitting = false, placeholder, autoFocus = false, errorMessage = "", showAskQuestionToggle = false, askQuestionChecked = false, onAskQuestionChange, askQuestionForced = false, hideAuthorSelector = false, lockedAuthorName, onFooterWarningChange, hideEditor = false, hideActions = false, hidePrimarySubmitAction = false, categoryPrompt, }) {
29
+ function getComposerModeLabel(mode, messages) {
30
+ const kind = resolveComposerModeActionKind(mode);
31
+ if (kind === "ask") {
32
+ return messages.composer.modeTag.ask;
33
+ }
34
+ if (kind === "denied") {
35
+ return messages.composer.modeTag.denied;
36
+ }
37
+ return messages.composer.modeTag.complete;
38
+ }
39
+ function ComposerModeIcon({ mode, className }) {
40
+ const kind = resolveComposerModeActionKind(mode);
41
+ const color = THREAD_ACTION_STYLE[kind].color;
42
+ if (kind === "ask") {
43
+ return (_jsx(AskActionIcon, { className: className, fill: color }));
44
+ }
45
+ if (kind === "denied") {
46
+ return (_jsx(DeniedActionIcon, { className: className, fill: color }));
47
+ }
48
+ return (_jsx(CompleteActionIcon, { className: className, fill: color }));
49
+ }
50
+ function ComposerModeTag({ mode, messages, onDismiss }) {
51
+ const kind = resolveComposerModeActionKind(mode);
52
+ const style = THREAD_ACTION_STYLE[kind];
53
+ return (_jsxs("span", { className: `inline-flex h-[22px] shrink-0 items-center gap-[4px] rounded-full px-[8px] text-[12px] font-semibold ${style.tagBg} ${style.tagText}`, style: { color: style.color }, children: [_jsx(ComposerModeIcon, { mode: mode, className: "h-[12px] w-[12px]" }), _jsx("span", { style: { color: style.color }, children: getComposerModeLabel(mode, messages) }), onDismiss ? (_jsx("button", { type: "button", "data-fivepixels-interactive": "", onClick: onDismiss, "aria-label": messages.composer.modeTagDismissAriaLabel, className: `ml-[2px] inline-flex h-[14px] w-[14px] items-center justify-center rounded-full ${style.tagDismissHoverBg}`, style: { color: style.color }, children: _jsx(CloseIcon, { className: "h-[10px] w-[10px]" }) })) : null] }));
54
+ }
55
+ function ReplyTextarea({ value, onChange, placeholder, autoFocus, onSubmitShortcut, onMultilineChange, reserveInlineStart = 0, }) {
56
+ const textareaRef = useRef(null);
57
+ const measureFrameRef = useRef(null);
58
+ const lastMultilineRef = useRef(null);
59
+ const syncHeight = useCallback(() => {
60
+ const textarea = textareaRef.current;
61
+ if (!textarea) {
62
+ return;
63
+ }
64
+ const measureRoot = textarea.closest(`[${REPLY_MEASURE_ROOT_ATTR}]`);
65
+ const rootWidth = measureRoot instanceof HTMLElement ? measureRoot.clientWidth : (textarea.parentElement?.clientWidth ?? textarea.clientWidth);
66
+ const measureWidth = reserveInlineStart > 0 ? Math.max(80, rootWidth - reserveInlineStart) : rootWidth;
67
+ const previousWidth = textarea.style.width;
68
+ const previousFlex = textarea.style.flex;
69
+ const previousMinWidth = textarea.style.minWidth;
70
+ // Isolate measurement from flex siblings (mode tag) so wrap detection stays stable across layouts.
71
+ textarea.style.flex = "none";
72
+ textarea.style.minWidth = "0";
73
+ textarea.style.width = `${measureWidth}px`;
74
+ textarea.style.height = "auto";
75
+ const measureScrollHeight = textarea.scrollHeight;
76
+ const styles = window.getComputedStyle(textarea);
77
+ const paddingY = (Number.parseFloat(styles.paddingTop) || 0) + (Number.parseFloat(styles.paddingBottom) || 0);
78
+ const lineHeight = Number.parseFloat(styles.lineHeight) || REPLY_LINE_HEIGHT_PX;
79
+ const singleLineHeight = lineHeight + paddingY;
80
+ const isMultiline = value.includes("\n") || measureScrollHeight > singleLineHeight + 1;
81
+ textarea.style.flex = previousFlex;
82
+ textarea.style.minWidth = previousMinWidth;
83
+ textarea.style.width = previousWidth;
84
+ textarea.style.height = "auto";
85
+ const displayScrollHeight = textarea.scrollHeight;
86
+ const nextHeight = Math.min(Math.max(REPLY_TEXTAREA_MIN_HEIGHT, displayScrollHeight), REPLY_TEXTAREA_MAX_HEIGHT);
87
+ textarea.style.height = `${nextHeight}px`;
88
+ textarea.style.overflowY = displayScrollHeight > REPLY_TEXTAREA_MAX_HEIGHT ? "auto" : "hidden";
89
+ if (lastMultilineRef.current === isMultiline) {
90
+ return;
91
+ }
92
+ lastMultilineRef.current = isMultiline;
93
+ onMultilineChange?.(isMultiline);
94
+ }, [onMultilineChange, reserveInlineStart, value]);
95
+ useLayoutEffect(() => {
96
+ lastMultilineRef.current = null;
97
+ }, [reserveInlineStart]);
98
+ useLayoutEffect(() => {
99
+ syncHeight();
100
+ }, [syncHeight]);
101
+ useEffect(() => {
102
+ const handleResize = () => {
103
+ if (measureFrameRef.current !== null) {
104
+ window.cancelAnimationFrame(measureFrameRef.current);
105
+ }
106
+ measureFrameRef.current = window.requestAnimationFrame(() => {
107
+ syncHeight();
108
+ });
109
+ };
110
+ window.addEventListener("resize", handleResize);
111
+ return () => {
112
+ window.removeEventListener("resize", handleResize);
113
+ if (measureFrameRef.current !== null) {
114
+ window.cancelAnimationFrame(measureFrameRef.current);
115
+ }
116
+ };
117
+ }, [syncHeight]);
118
+ return (_jsx("textarea", { ref: textareaRef, autoFocus: autoFocus, value: value, onChange: (event) => onChange(event.target.value), placeholder: placeholder, rows: 1, className: "max-h-[200px] w-full min-w-0 flex-1 resize-none overflow-hidden bg-transparent px-[4px] py-[6px] text-[14px] leading-[1.5] text-[var(--adaptive-text-primary)] outline-none placeholder:text-[var(--adaptive-text-muted)]", style: { minHeight: REPLY_TEXTAREA_MIN_HEIGHT }, onKeyDown: (event) => {
119
+ if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
120
+ event.preventDefault();
121
+ onSubmitShortcut();
122
+ }
123
+ } }));
124
+ }
125
+ export function FeedbackComposer({ message = "", onMessageChange, mentions = [], onMentionsChange, enableElementMentions = false, cases, onCaseChange, onAddCase, onRemoveCase, authorName, onAuthorNameChange, authors, fields: _fields, fieldValues: _fieldValues, onFieldChange: _onFieldChange, category = null, onCategoryChange, showCategory = false, showTags: _showTags = false, onSubmit, isSubmitting = false, showGitHubIssueOnCreate = false, onGitHubIssueSubmit, isGitHubIssueSubmitting = false, placeholder, autoFocus = false, errorMessage = "", showAskQuestionToggle = false, askQuestionChecked = false, onAskQuestionChange, askQuestionForced = false, composerMode = null, onCancelComposerMode, hideAuthorSelector = false, lockedAuthorName, onFooterWarningChange, hideEditor = false, hideActions = false, hidePrimarySubmitAction = false, categoryPrompt, showCaseTabBar = true, activeCaseId, onActiveCaseIdChange, }) {
23
126
  const { messages } = useReportPreferences();
24
127
  const [isGitHubIssueConfirming, setIsGitHubIssueConfirming] = useState(false);
25
128
  const [categoryAttentionKey, setCategoryAttentionKey] = useState(0);
26
129
  const [caseAttentionKey, setCaseAttentionKey] = useState(0);
27
- const isQuestionMode = askQuestionForced || askQuestionChecked;
130
+ const [isReplyMultiline, setIsReplyMultiline] = useState(false);
131
+ const resolvedComposerMode = composerMode ?? (askQuestionForced ? "question" : null);
132
+ const isQuestionMode = askQuestionForced || askQuestionChecked || resolvedComposerMode === "question";
28
133
  const usesCaseEditor = Boolean(cases && onCaseChange && onAddCase && onRemoveCase);
29
- const showActionRow = !hideActions && (showAskQuestionToggle || showGitHubIssueOnCreate || !hidePrimarySubmitAction);
134
+ const showInlineComposerModeTag = Boolean(resolvedComposerMode && !isReplyMultiline);
135
+ const showFooterComposerModeTag = Boolean(resolvedComposerMode && isReplyMultiline);
136
+ const showActionRow = !hideActions && (showAskQuestionToggle || showGitHubIssueOnCreate || !hidePrimarySubmitAction || showFooterComposerModeTag);
30
137
  const resolvedPlaceholder = isQuestionMode ? messages.composer.questionPlaceholder : (placeholder ?? (usesCaseEditor ? messages.fieldEditor.messagePlaceholder : messages.composer.placeholder));
31
138
  const emptyCaseIds = useMemo(() => (cases ?? []).filter((item) => !item.text.trim()).map((item) => item.id), [cases]);
32
139
  const hasEmptyCase = emptyCaseIds.length > 0;
33
140
  const isCategoryRequiredError = errorMessage === messages.errors.categoryRequired;
34
141
  const isEmptyCaseError = isCaseTextErrorMessage(errorMessage, cases?.length ?? 0, messages.errors.caseTextRequired, messages.errors.casesRequired);
35
- const categoryNeedsAttention = showCategory && !category && !hasEmptyCase && (categoryAttentionKey > 0 || isCategoryRequiredError);
142
+ const canSelectCategory = Boolean(onCategoryChange);
143
+ const categoryNeedsAttention = canSelectCategory && !category && !hasEmptyCase && (categoryAttentionKey > 0 || isCategoryRequiredError);
36
144
  const caseNeedsAttention = usesCaseEditor && hasEmptyCase && (caseAttentionKey > 0 || isEmptyCaseError);
37
145
  const footerWarning = caseNeedsAttention ? messages.errors.emptyCaseMessageRequired : categoryNeedsAttention ? messages.errors.categoryRequired : null;
38
146
  const isFooterHandledError = isCategoryRequiredError || isEmptyCaseError;
@@ -54,11 +162,11 @@ export function FeedbackComposer({ message = "", onMessageChange, cases, onCaseC
54
162
  setCaseAttentionKey((current) => current + 1);
55
163
  }, [isEmptyCaseError, usesCaseEditor, hasEmptyCase, errorMessage]);
56
164
  useEffect(() => {
57
- if (!isCategoryRequiredError || !showCategory || category || hasEmptyCase) {
165
+ if (!isCategoryRequiredError || !canSelectCategory || category || hasEmptyCase) {
58
166
  return;
59
167
  }
60
168
  setCategoryAttentionKey((current) => current + 1);
61
- }, [isCategoryRequiredError, showCategory, category, hasEmptyCase, errorMessage]);
169
+ }, [isCategoryRequiredError, canSelectCategory, category, hasEmptyCase, errorMessage]);
62
170
  useEffect(() => {
63
171
  if (!hasEmptyCase && caseAttentionKey > 0) {
64
172
  setCaseAttentionKey(0);
@@ -69,12 +177,20 @@ export function FeedbackComposer({ message = "", onMessageChange, cases, onCaseC
69
177
  setCategoryAttentionKey(0);
70
178
  }
71
179
  }, [category, categoryAttentionKey]);
180
+ useEffect(() => {
181
+ if (!resolvedComposerMode) {
182
+ setIsReplyMultiline(false);
183
+ }
184
+ }, [resolvedComposerMode]);
185
+ const handleReplyMultilineChange = useCallback((next) => {
186
+ setIsReplyMultiline((current) => (current === next ? current : next));
187
+ }, []);
72
188
  const bumpValidationAttention = () => {
73
189
  if (usesCaseEditor && hasEmptyCase) {
74
190
  setCaseAttentionKey((current) => current + 1);
75
191
  return;
76
192
  }
77
- if (showCategory && !category) {
193
+ if (canSelectCategory && !category) {
78
194
  setCategoryAttentionKey((current) => current + 1);
79
195
  }
80
196
  };
@@ -97,15 +213,13 @@ export function FeedbackComposer({ message = "", onMessageChange, cases, onCaseC
97
213
  setIsGitHubIssueConfirming(false);
98
214
  onGitHubIssueSubmit();
99
215
  };
100
- return (_jsxs("div", { className: `flex w-full flex-col border border-[var(--adaptive-border-subtle)] bg-[var(--adaptive-neutralTintOpacity900)] backdrop-blur-sm ${usesCaseEditor && !hideEditor ? "min-h-0 flex-1" : ""}`, children: [!hideEditor ? (_jsxs("div", { className: `relative ${usesCaseEditor ? "min-h-0 flex-1" : ""}`, children: [errorMessage && !isFooterHandledError ? (_jsx("p", { role: "alert", className: "absolute bottom-full left-[8px] right-[8px] z-10 mb-[6px] rounded-[8px] border border-rose-200 bg-rose-50 px-[8px] py-[4px] text-[12px] leading-[1.4] text-rose-700 shadow-[0_2px_8px_rgba(0,0,0,0.08)]", children: errorMessage })) : null, usesCaseEditor ? (_jsx(FeedbackCaseEditor, { cases: cases, onCaseChange: onCaseChange, onAddCase: onAddCase, onRemoveCase: onRemoveCase, autoFocus: autoFocus, onSubmitShortcut: handleSubmit, needsAttention: caseNeedsAttention, attentionKey: caseAttentionKey, emptyCaseIds: emptyCaseIds })) : (_jsx("textarea", { autoFocus: autoFocus, value: message, onChange: (event) => onMessageChange?.(event.target.value), placeholder: resolvedPlaceholder, rows: 3, className: "min-h-[72px] w-full resize-none bg-transparent px-[12px] pt-[12px] text-[14px] leading-[1.5] text-[var(--adaptive-text-primary)] outline-none placeholder:text-[var(--adaptive-text-muted)]", onKeyDown: (event) => {
101
- if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
102
- event.preventDefault();
103
- handleSubmit();
104
- }
105
- } }))] })) : null, showActionRow ? (_jsx("div", { className: `flex items-center gap-[8px] px-[8px] pb-[8px] ${hideAuthorSelector && !lockedAuthorName ? "justify-end" : "justify-between"}`, children: _jsxs("div", { className: "flex shrink-0 items-center gap-[6px]", children: [showAskQuestionToggle ? (_jsxs("label", { className: "inline-flex items-center gap-[4px] px-[2px] text-[12px] text-[var(--adaptive-black600)]", children: [_jsx("input", { type: "checkbox", "data-fivepixels-interactive": "", checked: isQuestionMode, disabled: askQuestionForced || isActionDisabled, onChange: (event) => onAskQuestionChange?.(event.target.checked), className: "h-[14px] w-[14px] accent-[var(--adaptive-blue500)]" }), _jsx("span", { children: messages.composer.askQuestionLabel })] })) : null, showGitHubIssueOnCreate ? (_jsx("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: handleGitHubIssueSubmit, className: "inline-flex h-[24px] items-center justify-center gap-[4px] rounded-full border border-[var(--adaptive-border-subtle)] px-[12px] py-[4px] disabled:opacity-50", "aria-label": isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmAriaLabel : messages.composer.gitIssueSendAriaLabel, title: isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmTitle : messages.composer.gitIssueSendTitle, children: _jsxs("span", { className: "text-[12px] font-semibold text-[var(--adaptive-black500)]", children: ["+", " ", isGitHubIssueSubmitting
106
- ? messages.composer.gitIssueSendingLabel
107
- : isGitHubIssueConfirming
108
- ? messages.feedbackList.gitIssueConfirmLabel
109
- : messages.composer.gitIssueSendLabel] }) })) : null, !hidePrimarySubmitAction ? (_jsx(HoverTooltip, { label: messages.composer.sendAriaLabel, disabled: isActionDisabled, children: _jsx("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: handleSubmit, className: "inline-flex h-[32px] w-[32px] shrink-0 items-center justify-center rounded-full bg-[#f6562f] text-white disabled:opacity-50", "aria-label": messages.composer.sendAriaLabel, children: _jsx(SendIcon, { className: "h-[16px] w-[16px]" }) }) })) : null] }) })) : null, showCategory && categoryPrompt ? (_jsx("div", { className: "border-t border-[var(--adaptive-tintOpacity100)] px-[12px] py-[14px] text-[14px] font-semibold leading-[1.5] text-[var(--adaptive-text-primary)]", children: categoryPrompt })) : null, showCategory && onCategoryChange ? (_jsx(FeedbackCategorySelector, { value: category, onChange: onCategoryChange, messages: messages, needsAttention: categoryNeedsAttention, attentionKey: categoryAttentionKey })) : null] }));
216
+ return (_jsxs("div", { className: `flex w-full flex-col bg-[var(--adaptive-neutralTintOpacity50)] backdrop-blur-sm ${usesCaseEditor && !hideEditor ? "min-h-0 flex-1" : ""}`, children: [!hideEditor ? (_jsxs("div", { className: `relative ${usesCaseEditor ? "min-h-0 flex-1" : ""}`, children: [errorMessage && !isFooterHandledError ? (_jsx("p", { role: "alert", className: "absolute bottom-full left-[8px] right-[8px] z-10 mb-[6px] rounded-[8px] border border-rose-200 bg-rose-50 px-[8px] py-[4px] text-[12px] leading-[1.4] text-rose-700 shadow-[0_2px_8px_rgba(0,0,0,0.08)]", children: errorMessage })) : null, usesCaseEditor ? (_jsx(FeedbackCaseEditor, { cases: cases, onCaseChange: onCaseChange, onAddCase: onAddCase, onRemoveCase: onRemoveCase, autoFocus: autoFocus, onSubmitShortcut: handleSubmit, needsAttention: caseNeedsAttention, attentionKey: caseAttentionKey, emptyCaseIds: emptyCaseIds, showTabBar: showCaseTabBar, activeCaseId: activeCaseId, onActiveCaseIdChange: onActiveCaseIdChange })) : enableElementMentions ? (_jsx("div", { "data-reply-measure-root": "", className: "px-[8px] pt-[8px]", children: _jsxs("div", { className: showInlineComposerModeTag ? "flex items-start gap-[6px]" : undefined, children: [showInlineComposerModeTag && resolvedComposerMode ? (_jsx("div", { className: "flex h-[32px] shrink-0 items-center", children: _jsx(ComposerModeTag, { mode: resolvedComposerMode, messages: messages, onDismiss: onCancelComposerMode }) })) : null, _jsx(MentionComposerInput, { value: message, mentions: mentions, onChange: ({ message: nextMessage, mentions: nextMentions }) => {
217
+ onMessageChange?.(nextMessage);
218
+ onMentionsChange?.(nextMentions);
219
+ }, placeholder: resolvedPlaceholder, autoFocus: autoFocus, onSubmitShortcut: handleSubmit, onMultilineChange: handleReplyMultilineChange, reserveInlineStart: resolvedComposerMode ? COMPOSER_MODE_TAG_INLINE_RESERVE_PX : 0 })] }) })) : (_jsx("div", { "data-reply-measure-root": "", className: "px-[8px] pt-[8px]", children: _jsxs("div", { className: showInlineComposerModeTag ? "flex items-start gap-[6px]" : undefined, children: [showInlineComposerModeTag && resolvedComposerMode ? (_jsx("div", { className: "flex h-[32px] shrink-0 items-center", children: _jsx(ComposerModeTag, { mode: resolvedComposerMode, messages: messages, onDismiss: onCancelComposerMode }) })) : null, _jsx(ReplyTextarea, { value: message, onChange: (value) => onMessageChange?.(value), placeholder: resolvedPlaceholder, autoFocus: autoFocus, onSubmitShortcut: handleSubmit, onMultilineChange: handleReplyMultilineChange, reserveInlineStart: resolvedComposerMode ? COMPOSER_MODE_TAG_INLINE_RESERVE_PX : 0 })] }) }))] })) : null, showActionRow ? (_jsxs("div", { className: `flex items-center gap-[8px] px-[8px] pb-[8px] ${showFooterComposerModeTag || !(hideAuthorSelector && !lockedAuthorName) ? "justify-between" : "justify-end"}`, children: [showFooterComposerModeTag && resolvedComposerMode ? (_jsx(ComposerModeTag, { mode: resolvedComposerMode, messages: messages, onDismiss: onCancelComposerMode })) : (_jsx("div", { className: "min-w-0 flex-1" })), _jsxs("div", { className: "flex shrink-0 items-center gap-[6px]", children: [showAskQuestionToggle ? (_jsxs("label", { className: "inline-flex items-center gap-[4px] px-[2px] text-[12px] text-[var(--adaptive-black600)]", children: [_jsx("input", { type: "checkbox", "data-fivepixels-interactive": "", checked: isQuestionMode, disabled: askQuestionForced || isActionDisabled, onChange: (event) => onAskQuestionChange?.(event.target.checked), className: "h-[14px] w-[14px] accent-[var(--adaptive-blue500)]" }), _jsx("span", { children: messages.composer.askQuestionLabel })] })) : null, showGitHubIssueOnCreate ? (_jsx("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: handleGitHubIssueSubmit, className: "inline-flex h-[24px] items-center justify-center gap-[4px] rounded-full border border-[var(--adaptive-border-subtle)] px-[12px] py-[4px] disabled:opacity-50", "aria-label": isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmAriaLabel : messages.composer.gitIssueSendAriaLabel, title: isGitHubIssueConfirming ? messages.feedbackList.gitIssueConfirmTitle : messages.composer.gitIssueSendTitle, children: _jsxs("span", { className: "text-[12px] font-semibold text-[var(--adaptive-black500)]", children: ["+", " ", isGitHubIssueSubmitting
220
+ ? messages.composer.gitIssueSendingLabel
221
+ : isGitHubIssueConfirming
222
+ ? messages.feedbackList.gitIssueConfirmLabel
223
+ : messages.composer.gitIssueSendLabel] }) })) : null, !hidePrimarySubmitAction ? (_jsx(HoverTooltip, { label: messages.composer.sendAriaLabel, disabled: isActionDisabled, children: _jsx("button", { type: "button", "data-fivepixels-interactive": "", disabled: isActionDisabled, onClick: handleSubmit, className: "inline-flex h-[32px] w-[32px] shrink-0 items-center justify-center rounded-full bg-[#f6562f] text-white disabled:opacity-50", "aria-label": messages.composer.sendAriaLabel, children: _jsx(SendIcon, { className: "h-[16px] w-[16px]" }) }) })) : null] })] })) : null, showCategory && categoryPrompt ? _jsx("div", { className: "px-[12px] py-[8px] text-[16px] font-bold leading-[1.5] text-[var(--adaptive-text-primary)]", children: categoryPrompt }) : null, showCategory && onCategoryChange ? (_jsx(FeedbackCategorySelector, { value: category, onChange: onCategoryChange, messages: messages, needsAttention: categoryNeedsAttention, attentionKey: categoryAttentionKey })) : null] }));
110
224
  }
111
225
  //# sourceMappingURL=FeedbackComposer.js.map