@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,273 @@
1
+ import { createMentionId, MENTION_TOKEN_PATTERN, mentionPlainLabel, serializeMentionToken } from "../../types/mention.js";
2
+ import { TARGET_SELECTOR } from "../../constants/report.js";
3
+ import { isFeedbackTargetVisible, toPickSnapshot } from "../../utils/shared/dom.js";
4
+ const REPORT_HOST_ID = "fivepixels-root";
5
+ const SKIP_TAGS = new Set(["SCRIPT", "STYLE", "NOSCRIPT", "TEXTAREA", "INPUT", "SELECT", "OPTION", "SVG", "PATH"]);
6
+ const MAX_LABEL_LENGTH = 48;
7
+ const MAX_CANDIDATES = 12;
8
+ function normalizeSearch(text) {
9
+ return text.replace(/\s+/g, " ").trim().toLowerCase();
10
+ }
11
+ function normalizeLabel(text) {
12
+ return text.replace(/\s+/g, " ").trim();
13
+ }
14
+ function truncateLabel(text) {
15
+ if (text.length <= MAX_LABEL_LENGTH) {
16
+ return text;
17
+ }
18
+ return `${text.slice(0, MAX_LABEL_LENGTH - 1)}…`;
19
+ }
20
+ function isInsideFivePixelsHost(element) {
21
+ const host = document.getElementById(REPORT_HOST_ID);
22
+ return Boolean(host && (host === element || host.contains(element)));
23
+ }
24
+ function isUsefulMentionElement(element) {
25
+ if (SKIP_TAGS.has(element.tagName)) {
26
+ return false;
27
+ }
28
+ if (element.isContentEditable) {
29
+ return false;
30
+ }
31
+ if (element.closest("[data-fivepixels-interactive], [data-fivepixels-host]")) {
32
+ return false;
33
+ }
34
+ if (isInsideFivePixelsHost(element)) {
35
+ return false;
36
+ }
37
+ if (!isFeedbackTargetVisible(element)) {
38
+ return false;
39
+ }
40
+ return true;
41
+ }
42
+ function collectVisibleLabel(element) {
43
+ const directParts = [];
44
+ for (const node of element.childNodes) {
45
+ if (node.nodeType === Node.TEXT_NODE) {
46
+ const value = normalizeLabel(node.textContent ?? "");
47
+ if (value) {
48
+ directParts.push(value);
49
+ }
50
+ }
51
+ }
52
+ if (directParts.length > 0) {
53
+ return truncateLabel(directParts.join(" "));
54
+ }
55
+ const aria = element.getAttribute("aria-label")?.trim();
56
+ if (aria) {
57
+ return truncateLabel(aria);
58
+ }
59
+ const title = element.getAttribute("title")?.trim();
60
+ if (title) {
61
+ return truncateLabel(title);
62
+ }
63
+ const inner = normalizeLabel(element.innerText || element.textContent || "");
64
+ if (!inner) {
65
+ return "";
66
+ }
67
+ // Prefer short leaf labels; skip huge containers.
68
+ if (inner.length > MAX_LABEL_LENGTH * 2) {
69
+ return "";
70
+ }
71
+ return truncateLabel(inner);
72
+ }
73
+ function matchesQuery(candidate, normalizedQuery) {
74
+ if (!normalizedQuery) {
75
+ return true;
76
+ }
77
+ const haystacks = [candidate.label, candidate.reportId ?? "", candidate.suggestedReportId ?? "", candidate.element.tagName].map(normalizeSearch);
78
+ return haystacks.some((value) => value.includes(normalizedQuery));
79
+ }
80
+ function candidateSortKey(candidate, normalizedQuery) {
81
+ const label = normalizeSearch(candidate.label);
82
+ const reportId = normalizeSearch(candidate.reportId ?? "");
83
+ const suggested = normalizeSearch(candidate.suggestedReportId ?? "");
84
+ const taggedBoost = candidate.reportId ? 0 : 1;
85
+ const startsBoost = normalizedQuery && (label.startsWith(normalizedQuery) || reportId.startsWith(normalizedQuery) || suggested.startsWith(normalizedQuery)) ? 0 : 1;
86
+ return [taggedBoost, startsBoost, label.length];
87
+ }
88
+ export function buildElementMentionFromElement(element, labelOverride) {
89
+ if (!isUsefulMentionElement(element)) {
90
+ return null;
91
+ }
92
+ const snapshot = toPickSnapshot(element);
93
+ if (!snapshot) {
94
+ return null;
95
+ }
96
+ const label = truncateLabel(labelOverride || collectVisibleLabel(element) || snapshot.suggestedReportId || snapshot.id);
97
+ if (!label) {
98
+ return null;
99
+ }
100
+ return {
101
+ id: createMentionId(),
102
+ label,
103
+ targetSelector: snapshot.targetSelector ?? null,
104
+ reportId: snapshot.isTagged ? snapshot.id : null,
105
+ suggestedReportId: snapshot.suggestedReportId ?? null,
106
+ element,
107
+ snapshot,
108
+ };
109
+ }
110
+ function pushCandidate(matches, seen, candidate, normalizedQuery) {
111
+ if (!candidate) {
112
+ return;
113
+ }
114
+ const key = `${candidate.targetSelector ?? ""}::${candidate.reportId ?? ""}::${candidate.label}`;
115
+ if (seen.has(key) || !matchesQuery(candidate, normalizedQuery)) {
116
+ return;
117
+ }
118
+ seen.add(key);
119
+ matches.push(candidate);
120
+ }
121
+ export function findElementMentionCandidates(query, limit = MAX_CANDIDATES) {
122
+ const normalizedQuery = normalizeSearch(query);
123
+ const matches = [];
124
+ const seen = new Set();
125
+ // Prioritize tagged feedback targets (data-report-id).
126
+ for (const element of Array.from(document.querySelectorAll(TARGET_SELECTOR))) {
127
+ const reportId = element.dataset.reportId?.trim() ?? "";
128
+ const visibleLabel = collectVisibleLabel(element);
129
+ const label = visibleLabel || reportId;
130
+ pushCandidate(matches, seen, buildElementMentionFromElement(element, label), normalizedQuery);
131
+ }
132
+ // Also index visible text leaves for untagged UI copy.
133
+ const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT);
134
+ let node = walker.nextNode();
135
+ while (node) {
136
+ const element = node;
137
+ if (!element.dataset.reportId) {
138
+ const label = collectVisibleLabel(element);
139
+ if (label) {
140
+ pushCandidate(matches, seen, buildElementMentionFromElement(element, label), normalizedQuery);
141
+ }
142
+ }
143
+ node = walker.nextNode();
144
+ }
145
+ return matches
146
+ .sort((left, right) => {
147
+ const leftKey = candidateSortKey(left, normalizedQuery);
148
+ const rightKey = candidateSortKey(right, normalizedQuery);
149
+ for (let index = 0; index < leftKey.length; index += 1) {
150
+ if (leftKey[index] !== rightKey[index]) {
151
+ return leftKey[index] - rightKey[index];
152
+ }
153
+ }
154
+ return 0;
155
+ })
156
+ .slice(0, limit);
157
+ }
158
+ export function resolveMentionElement(mention) {
159
+ if (mention.reportId) {
160
+ try {
161
+ const tagged = document.querySelector(`[data-report-id="${CSS.escape(mention.reportId)}"]`);
162
+ if (tagged) {
163
+ return tagged;
164
+ }
165
+ }
166
+ catch {
167
+ // ignore invalid selectors
168
+ }
169
+ }
170
+ if (mention.targetSelector) {
171
+ try {
172
+ return document.querySelector(mention.targetSelector);
173
+ }
174
+ catch {
175
+ return null;
176
+ }
177
+ }
178
+ return null;
179
+ }
180
+ export function resolveMentionSnapshot(mention) {
181
+ const element = resolveMentionElement(mention);
182
+ if (!element) {
183
+ return null;
184
+ }
185
+ return toPickSnapshot(element);
186
+ }
187
+ export function parseMentionMessage(message, mentions = []) {
188
+ const mentionById = new Map(mentions.map((item) => [item.id, item]));
189
+ const parts = [];
190
+ let lastIndex = 0;
191
+ for (const match of message.matchAll(MENTION_TOKEN_PATTERN)) {
192
+ const index = match.index ?? 0;
193
+ const mentionId = match[1];
194
+ const mention = mentionById.get(mentionId);
195
+ if (index > lastIndex) {
196
+ parts.push({ type: "text", value: message.slice(lastIndex, index) });
197
+ }
198
+ if (mention) {
199
+ parts.push({ type: "mention", mention });
200
+ }
201
+ else {
202
+ parts.push({ type: "text", value: match[0] });
203
+ }
204
+ lastIndex = index + match[0].length;
205
+ }
206
+ if (lastIndex < message.length) {
207
+ parts.push({ type: "text", value: message.slice(lastIndex) });
208
+ }
209
+ return parts.length > 0 ? parts : [{ type: "text", value: message }];
210
+ }
211
+ export function mentionMessageToPlainText(message, mentions = []) {
212
+ return parseMentionMessage(message, mentions)
213
+ .map((part) => (part.type === "text" ? part.value : mentionPlainLabel(part.mention)))
214
+ .join("");
215
+ }
216
+ export function stripMentionTokensForEmptyCheck(message, mentions = []) {
217
+ return mentionMessageToPlainText(message, mentions).trim();
218
+ }
219
+ export function toStoredMention(candidate) {
220
+ return {
221
+ id: candidate.id,
222
+ label: candidate.label,
223
+ targetSelector: candidate.targetSelector,
224
+ reportId: candidate.reportId,
225
+ suggestedReportId: candidate.suggestedReportId,
226
+ };
227
+ }
228
+ export function insertMentionToken(message, cursor, atStart, mention) {
229
+ const token = serializeMentionToken(mention.id);
230
+ const nextMessage = `${message.slice(0, atStart)}${token} ${message.slice(cursor)}`;
231
+ return {
232
+ message: nextMessage,
233
+ cursor: atStart + token.length + 1,
234
+ };
235
+ }
236
+ /** Detect an in-progress `@query` at the end of caret text or serialized draft. */
237
+ export function getAtQuery(textBeforeCursor) {
238
+ const match = textBeforeCursor.match(/(^|[\s([{])@([^\s@{}]*)$/);
239
+ if (!match) {
240
+ return null;
241
+ }
242
+ return {
243
+ query: match[2] ?? "",
244
+ atOffsetInBefore: textBeforeCursor.length - (match[2]?.length ?? 0) - 1,
245
+ };
246
+ }
247
+ /**
248
+ * Resolve the active mention query using caret text when available,
249
+ * otherwise fall back to the serialized editor message (safe with chips / shadow DOM).
250
+ */
251
+ export function resolveActiveMentionQuery(options) {
252
+ if (options.textBeforeCaret !== null && options.textBeforeCaret !== undefined) {
253
+ return getAtQuery(options.textBeforeCaret);
254
+ }
255
+ if (options.serializedMessage !== null && options.serializedMessage !== undefined) {
256
+ return getAtQuery(options.serializedMessage);
257
+ }
258
+ return null;
259
+ }
260
+ export function replaceActiveMentionQuery(message, query, mention, atOffsetInBefore) {
261
+ const needle = `@${query}`;
262
+ const replaceAt = atOffsetInBefore ?? message.lastIndexOf(needle);
263
+ if (replaceAt < 0 || message.slice(replaceAt, replaceAt + needle.length) !== needle) {
264
+ return null;
265
+ }
266
+ // Avoid replacing the `@` inside an existing `@{id}` token when offset is omitted.
267
+ if (atOffsetInBefore === undefined && message[replaceAt + 1] === "{") {
268
+ return null;
269
+ }
270
+ const token = serializeMentionToken(mention.id);
271
+ return `${message.slice(0, replaceAt)}${token} ${message.slice(replaceAt + needle.length)}`;
272
+ }
273
+ //# sourceMappingURL=elementMentions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elementMentions.js","sourceRoot":"","sources":["../../../src/utils/mention/elementMentions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ElementMention } from "../../types/mention.js";
2
+ export declare const MENTION_CARET_GUARD = "\u200B";
3
+ export declare const MENTION_CHIP_CLASS = "mx-[1px] inline-flex items-center rounded-[6px] bg-[var(--adaptive-blue100)] px-[6px] py-[4px] text-[12px] font-semibold text-[var(--adaptive-blue600)] align-baseline";
4
+ export type EditorCaretPoint = {
5
+ node: Node;
6
+ offset: number;
7
+ };
8
+ /**
9
+ * Serialize contentEditable HTML into a plain mention draft.
10
+ * Chrome/Safari often insert Enter as block <div>s instead of <br>, so block boundaries become `\n`.
11
+ * A trailing/empty `<div><br></div>` is a block break only — the inner BR is a caret placeholder, not an extra line.
12
+ */
13
+ export declare function serializeMentionEditor(root: HTMLElement, mentions: ElementMention[]): {
14
+ message: string;
15
+ mentions: ElementMention[];
16
+ };
17
+ /** Same rules as full serialize, but only content before the current caret. */
18
+ export declare function serializeMentionEditorBeforeCaret(root: HTMLElement, mentions: ElementMention[], caret: EditorCaretPoint | null): {
19
+ message: string;
20
+ mentions: ElementMention[];
21
+ } | null;
22
+ export declare function getEditorCaretPoint(root: HTMLElement): EditorCaretPoint | null;
23
+ export declare function getCaretClientRect(root: HTMLElement): DOMRect | null;
24
+ export declare function renderMentionEditorContent(root: HTMLElement, message: string, mentions: ElementMention[], chipClassName?: string): void;
25
+ export declare function placeCaretAfterMention(editor: HTMLElement, mentionId: string): void;
26
+ /** Remove the nearest mention chip behind a collapsed caret (Backspace). */
27
+ export declare function deleteMentionChipBeforeCaret(editor: HTMLElement, mentions: ElementMention[]): {
28
+ message: string;
29
+ mentions: ElementMention[];
30
+ } | null;
31
+ //# sourceMappingURL=mentionComposerDom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentionComposerDom.d.ts","sourceRoot":"","sources":["../../../src/utils/mention/mentionComposerDom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKzD,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,eAAO,MAAM,kBAAkB,2KAC6I,CAAC;AAE7K,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAyKF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE;;;EAEnF;AAED,+EAA+E;AAC/E,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI;;;SAM9H;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAa9E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI,CAgBpE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,aAAa,SAAqB,QAsB5I;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,QAyB5E;AAED,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE;;;SA4C3F"}
@@ -0,0 +1,253 @@
1
+ import { mentionPlainLabel, serializeMentionToken } from "../../types/mention.js";
2
+ import { parseMentionMessage } from "../../utils/mention/elementMentions.js";
3
+ const BLOCK_TAGS = new Set(["DIV", "P", "LI", "SECTION", "ARTICLE", "HEADER", "FOOTER", "H1", "H2", "H3", "H4", "H5", "H6"]);
4
+ export const MENTION_CARET_GUARD = "\u200B";
5
+ export const MENTION_CHIP_CLASS = "mx-[1px] inline-flex items-center rounded-[6px] bg-[var(--adaptive-blue100)] px-[6px] py-[4px] text-[12px] font-semibold text-[var(--adaptive-blue600)] align-baseline";
6
+ function normalizeEditorText(text) {
7
+ return text.replace(/\u200B/g, "").replace(/\u00A0/g, " ");
8
+ }
9
+ function isIgnorableText(node) {
10
+ if (node.nodeType !== Node.TEXT_NODE) {
11
+ return false;
12
+ }
13
+ return !normalizeEditorText(node.textContent ?? "");
14
+ }
15
+ /** Empty contenteditable blocks often contain only a caret placeholder <br>. */
16
+ function isBlockPlaceholder(element) {
17
+ const children = Array.from(element.childNodes).filter((node) => !isIgnorableText(node));
18
+ if (children.length === 0) {
19
+ return true;
20
+ }
21
+ return children.every((node) => node instanceof HTMLElement && node.tagName === "BR");
22
+ }
23
+ function appendChip(parent, mention, chipClassName) {
24
+ // ZWSP guards let the caret sit before/after contentEditable=false chips.
25
+ parent.appendChild(document.createTextNode(MENTION_CARET_GUARD));
26
+ const chip = document.createElement("span");
27
+ chip.contentEditable = "false";
28
+ chip.dataset.mentionId = mention.id;
29
+ chip.className = chipClassName;
30
+ chip.textContent = mentionPlainLabel(mention);
31
+ parent.appendChild(chip);
32
+ parent.appendChild(document.createTextNode(MENTION_CARET_GUARD));
33
+ }
34
+ function serializeEditorTree(root, mentions, end) {
35
+ const mentionById = new Map(mentions.map((item) => [item.id, item]));
36
+ const used = [];
37
+ let message = "";
38
+ let hasContent = false;
39
+ let stopped = false;
40
+ const visit = (node) => {
41
+ if (stopped) {
42
+ return;
43
+ }
44
+ if (node.nodeType === Node.TEXT_NODE) {
45
+ const raw = node.textContent ?? "";
46
+ if (end && node === end.node) {
47
+ message += normalizeEditorText(raw.slice(0, Math.max(0, end.offset)));
48
+ hasContent = message.length > 0 || hasContent;
49
+ stopped = true;
50
+ return;
51
+ }
52
+ const text = normalizeEditorText(raw);
53
+ if (!text) {
54
+ return;
55
+ }
56
+ message += text;
57
+ hasContent = true;
58
+ return;
59
+ }
60
+ if (!(node instanceof HTMLElement)) {
61
+ return;
62
+ }
63
+ const mentionId = node.dataset.mentionId;
64
+ if (mentionId) {
65
+ if (end && (node === end.node || node.contains(end.node))) {
66
+ // Caret on/inside a chip → treat as after the token for query/replace.
67
+ const mention = mentionById.get(mentionId);
68
+ if (mention) {
69
+ message += serializeMentionToken(mention.id);
70
+ used.push(mention);
71
+ }
72
+ else {
73
+ message += normalizeEditorText(node.textContent ?? "");
74
+ }
75
+ hasContent = true;
76
+ stopped = true;
77
+ return;
78
+ }
79
+ const mention = mentionById.get(mentionId);
80
+ if (mention) {
81
+ message += serializeMentionToken(mention.id);
82
+ used.push(mention);
83
+ }
84
+ else {
85
+ message += normalizeEditorText(node.textContent ?? "");
86
+ }
87
+ hasContent = true;
88
+ return;
89
+ }
90
+ if (node.tagName === "BR") {
91
+ message += "\n";
92
+ hasContent = true;
93
+ return;
94
+ }
95
+ if (BLOCK_TAGS.has(node.tagName)) {
96
+ if (hasContent) {
97
+ message += "\n";
98
+ }
99
+ if (isBlockPlaceholder(node)) {
100
+ hasContent = true;
101
+ if (end && (node === end.node || node.contains(end.node))) {
102
+ stopped = true;
103
+ }
104
+ return;
105
+ }
106
+ visitChildren(node);
107
+ hasContent = true;
108
+ return;
109
+ }
110
+ visitChildren(node);
111
+ };
112
+ const visitChildren = (element) => {
113
+ const children = Array.from(element.childNodes);
114
+ for (let index = 0; index < children.length; index += 1) {
115
+ if (stopped) {
116
+ return;
117
+ }
118
+ if (end && end.node === element && end.offset === index) {
119
+ stopped = true;
120
+ return;
121
+ }
122
+ visit(children[index]);
123
+ if (stopped) {
124
+ return;
125
+ }
126
+ }
127
+ if (end && end.node === element && end.offset >= children.length) {
128
+ stopped = true;
129
+ }
130
+ };
131
+ visitChildren(root);
132
+ const uniqueUsed = Array.from(new Map(used.map((item) => [item.id, item])).values());
133
+ return { message, mentions: uniqueUsed };
134
+ }
135
+ /**
136
+ * Serialize contentEditable HTML into a plain mention draft.
137
+ * Chrome/Safari often insert Enter as block <div>s instead of <br>, so block boundaries become `\n`.
138
+ * A trailing/empty `<div><br></div>` is a block break only — the inner BR is a caret placeholder, not an extra line.
139
+ */
140
+ export function serializeMentionEditor(root, mentions) {
141
+ return serializeEditorTree(root, mentions, null);
142
+ }
143
+ /** Same rules as full serialize, but only content before the current caret. */
144
+ export function serializeMentionEditorBeforeCaret(root, mentions, caret) {
145
+ if (!caret) {
146
+ return null;
147
+ }
148
+ return serializeEditorTree(root, mentions, caret);
149
+ }
150
+ export function getEditorCaretPoint(root) {
151
+ const selection = window.getSelection();
152
+ if (!selection || selection.rangeCount === 0 || !selection.anchorNode || !root.contains(selection.anchorNode)) {
153
+ return null;
154
+ }
155
+ const range = selection.getRangeAt(0);
156
+ return {
157
+ node: range.endContainer,
158
+ offset: range.endOffset,
159
+ };
160
+ }
161
+ export function getCaretClientRect(root) {
162
+ const selection = window.getSelection();
163
+ if (!selection || selection.rangeCount === 0 || !selection.anchorNode || !root.contains(selection.anchorNode)) {
164
+ return null;
165
+ }
166
+ const range = selection.getRangeAt(0).cloneRange();
167
+ const rects = range.getClientRects();
168
+ const rect = rects.item(rects.length - 1) ?? range.getBoundingClientRect();
169
+ if (!rect || (rect.width === 0 && rect.height === 0 && rect.top === 0 && rect.left === 0)) {
170
+ return null;
171
+ }
172
+ return rect;
173
+ }
174
+ export function renderMentionEditorContent(root, message, mentions, chipClassName = MENTION_CHIP_CLASS) {
175
+ root.replaceChildren();
176
+ const parts = parseMentionMessage(message, mentions);
177
+ for (const part of parts) {
178
+ if (part.type === "text") {
179
+ const lines = part.value.split("\n");
180
+ lines.forEach((line, index) => {
181
+ if (line) {
182
+ root.appendChild(document.createTextNode(line));
183
+ }
184
+ if (index < lines.length - 1) {
185
+ root.appendChild(document.createElement("br"));
186
+ }
187
+ });
188
+ continue;
189
+ }
190
+ appendChip(root, part.mention, chipClassName);
191
+ }
192
+ }
193
+ export function placeCaretAfterMention(editor, mentionId) {
194
+ const selection = window.getSelection();
195
+ const chip = editor.querySelector(`[data-mention-id="${CSS.escape(mentionId)}"]`);
196
+ if (!selection) {
197
+ return;
198
+ }
199
+ const range = document.createRange();
200
+ if (chip?.nextSibling?.nodeType === Node.TEXT_NODE) {
201
+ const text = chip.nextSibling;
202
+ const offset = Math.min(1, text.textContent?.length ?? 0);
203
+ range.setStart(text, offset);
204
+ range.collapse(true);
205
+ }
206
+ else if (chip) {
207
+ range.setStartAfter(chip);
208
+ range.collapse(true);
209
+ }
210
+ else {
211
+ range.selectNodeContents(editor);
212
+ range.collapse(false);
213
+ }
214
+ selection.removeAllRanges();
215
+ selection.addRange(range);
216
+ }
217
+ /** Remove the nearest mention chip behind a collapsed caret (Backspace). */
218
+ export function deleteMentionChipBeforeCaret(editor, mentions) {
219
+ const caret = getEditorCaretPoint(editor);
220
+ if (!caret) {
221
+ return null;
222
+ }
223
+ let probe = null;
224
+ if (caret.node.nodeType === Node.TEXT_NODE) {
225
+ const text = caret.node.textContent ?? "";
226
+ const before = normalizeEditorText(text.slice(0, caret.offset));
227
+ if (before.length > 0) {
228
+ return null;
229
+ }
230
+ probe = caret.node.previousSibling;
231
+ }
232
+ else if (caret.node instanceof HTMLElement) {
233
+ probe = caret.node.childNodes.item(Math.max(0, caret.offset - 1));
234
+ }
235
+ while (probe && probe.nodeType === Node.TEXT_NODE && isIgnorableText(probe)) {
236
+ probe = probe.previousSibling;
237
+ }
238
+ if (!(probe instanceof HTMLElement) || !probe.dataset.mentionId) {
239
+ return null;
240
+ }
241
+ const mentionId = probe.dataset.mentionId;
242
+ const before = probe.previousSibling;
243
+ const after = probe.nextSibling;
244
+ probe.remove();
245
+ if (before?.nodeType === Node.TEXT_NODE && isIgnorableText(before)) {
246
+ before.remove();
247
+ }
248
+ if (after?.nodeType === Node.TEXT_NODE && isIgnorableText(after)) {
249
+ after.remove();
250
+ }
251
+ return serializeMentionEditor(editor, mentions.filter((item) => item.id !== mentionId));
252
+ }
253
+ //# sourceMappingURL=mentionComposerDom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentionComposerDom.js","sourceRoot":"","sources":["../../../src/utils/mention/mentionComposerDom.ts"],"names":[],"mappings":"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"}
@@ -64,5 +64,5 @@ export declare function buildYearMonthSummary(reports: ReportFeedback[], options
64
64
  export declare function buildActivitySummaryFromReports(reports: ReportFeedback[], params: ReportActivitySummaryParams): ReportActivitySummaryResult;
65
65
  export declare function getYearMonthCellDelay(monthIndex: number, staggerMs?: number): number;
66
66
  export declare function getYearEntranceDuration(staggerMs?: number, cellDurationMs?: number): number;
67
- export declare function resolveHeatmapLevel(count: number, maxCount: number): 1 | 0 | 2 | 3 | 4;
67
+ export declare function resolveHeatmapLevel(count: number, maxCount: number): 2 | 0 | 1 | 3 | 4;
68
68
  //# sourceMappingURL=heatmapActivity.d.ts.map
@@ -0,0 +1,5 @@
1
+ import type { ReportFeedback, ReportField } from "../../types/report.js";
2
+ import type { DraftReport } from "../../types/report-ui.js";
3
+ /** Hydrate the create-draft tooltip shape from an existing feedback report. */
4
+ export declare function buildDraftFromReport(report: ReportFeedback, fields: ReportField[]): DraftReport;
5
+ //# sourceMappingURL=buildDraftFromReport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildDraftFromReport.d.ts","sourceRoot":"","sources":["../../../src/utils/report/buildDraftFromReport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CA6B/F"}
@@ -0,0 +1,33 @@
1
+ import { createInitialFieldValues } from "../../utils/report/fields.js";
2
+ import { clampRatio } from "../../utils/marker/coordinates.js";
3
+ /** Hydrate the create-draft tooltip shape from an existing feedback report. */
4
+ export function buildDraftFromReport(report, fields) {
5
+ const viewportWidth = typeof window !== "undefined" ? window.innerWidth : report.position.viewport.width;
6
+ const viewportHeight = typeof window !== "undefined" ? window.innerHeight : report.position.viewport.height;
7
+ const xRatio = clampRatio(report.position.viewport.x);
8
+ const yRatio = clampRatio(report.position.viewport.y);
9
+ const target = report.position.target;
10
+ const anchor = report.position.anchor;
11
+ return {
12
+ clientX: xRatio * viewportWidth,
13
+ clientY: yRatio * viewportHeight,
14
+ xRatio,
15
+ yRatio,
16
+ elementXRatio: clampRatio(target?.x ?? 0.5),
17
+ elementYRatio: clampRatio(target?.y ?? 0.5),
18
+ anchorReportId: anchor?.reportId ?? null,
19
+ anchorReportType: anchor?.reportType ?? null,
20
+ anchorXRatio: anchor ? clampRatio(anchor.x) : null,
21
+ anchorYRatio: anchor ? clampRatio(anchor.y) : null,
22
+ scrollY: report.position.scrollY,
23
+ documentY: Math.round(report.position.scrollY + yRatio * viewportHeight),
24
+ reportId: report.report_id,
25
+ reportType: report.report_type,
26
+ targetSelector: report.target_selector ?? null,
27
+ suggestedReportId: null,
28
+ cases: report.cases.map((item) => ({ ...item })),
29
+ category: report.category ?? null,
30
+ fieldValues: createInitialFieldValues(fields, report.field_values),
31
+ };
32
+ }
33
+ //# sourceMappingURL=buildDraftFromReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildDraftFromReport.js","sourceRoot":"","sources":["../../../src/utils/report/buildDraftFromReport.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,+EAA+E;AAC/E,MAAM,UAAU,oBAAoB,CAAC,MAAsB,EAAE,MAAqB;IAC9E,MAAM,aAAa,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;IACzG,MAAM,cAAc,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC5G,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAEtC,OAAO;QACH,OAAO,EAAE,MAAM,GAAG,aAAa;QAC/B,OAAO,EAAE,MAAM,GAAG,cAAc;QAChC,MAAM;QACN,MAAM;QACN,aAAa,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC;QAC3C,aAAa,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC;QAC3C,cAAc,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI;QACxC,gBAAgB,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI;QAC5C,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAClD,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAClD,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;QAChC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,MAAM,GAAG,cAAc,CAAC;QACxE,QAAQ,EAAE,MAAM,CAAC,SAAS;QAC1B,UAAU,EAAE,MAAM,CAAC,WAAW;QAC9B,cAAc,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;QAC9C,iBAAiB,EAAE,IAAI;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAChD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QACjC,WAAW,EAAE,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC;KACrE,CAAC;AACN,CAAC"}