@adatechnology/conversations-ui 0.2.1 → 0.3.1

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.
@@ -903,4 +903,4 @@ type ConversationSimulatorPanelProps = Omit<ConversationPreviewProps, 'placehold
903
903
  };
904
904
  declare function ConversationSimulatorPanel({ onClose, channel, displayHandle, displayNumber, labels, headerActions, ...previewProps }: ConversationSimulatorPanelProps): react.JSX.Element;
905
905
 
906
- export { type PreviewUploadedMedia as $, AudioRecorderButton as A, type ConversationsUIConfig as B, CHANNEL_CAPABILITIES as C, type CreatePreviewMediaUploaderParams as D, type CreatePreviewWebhookClientParams as E, DEFAULT_AUDIO_RECORDER_BUTTON_LABELS as F, DEFAULT_CONVERSATION_CHANNEL as G, DEFAULT_CONVERSATION_SIMULATOR_PANEL_LABELS as H, DEFAULT_MAX_RECORDING_MILLISECONDS as I, DEFAULT_MEDIA_UPLOAD_PATH as J, type FormatContactHandleParams as K, HANDLE_KIND as L, type HandleKind as M, type InteractiveOption as N, type InteractivePayload as O, type InteractiveSection as P, type InteractiveSelection as Q, type ListConversationsParams as R, type ListDocumentsParams as S, MediaRenderer as T, type MediaRendererProps as U, type MessagePayload as V, type MessageTranscription as W, PreviewInProductionError as X, PreviewMediaUploadRejectedError as Y, type PreviewMediaUploadRequest as Z, type PreviewUploadedMedia$1 as _, type AudioRecorderButtonLabels as a, type PreviewWebhookClient as a0, PreviewWebhookRejectedError as a1, QUICK_REPLY_ATTACHMENT_LIMIT as a2, type QueuedAttachment as a3, type QuickReply as a4, type QuickReplyAttachment as a5, type QuickReplyInput as a6, REOPEN_MECHANISM as a7, type ReopenMechanism as a8, type ResolveMediaUrl as a9, SIMULATOR_FILE_MEDIA_KINDS as aa, type SSEProvider as ab, type SendPreviewMediaParams as ac, type SendSimulatorMediaParams as ad, type SimulatorMediaKind as ae, type StoredAttachmentSendResult as af, type ToSimulatorClientParams as ag, type TranscriptionMode as ah, type TranscriptionStatus as ai, acceptsMediaKind as aj, assertPreviewEnvironment as ak, capabilitiesOf as al, channelFiltersFor as am, contactFlag as an, createPreviewMediaPoster as ao, createPreviewMediaUploader as ap, createPreviewWebhookClient as aq, formatContactHandle as ar, isConversationSimulatorClient as as, mediaKindOf as at, mediaTypeOf as au, signPreviewPayload as av, simulatorPanelLabelsOf as aw, toConversationSimulatorClient as ax, type AudioRecorderButtonProps as b, CHANNEL_FILTER_ALL as c, CONVERSATION_CHANNEL as d, type ChannelCapabilities as e, type ChannelFilter as f, type ChannelFilterOption as g, type CompanyDocument as h, type CompanyDocumentPage as i, type ConversationChannel as j, type ConversationDocument as k, type ConversationDocumentPage as l, type ConversationEventSource as m, type ConversationPage as n, ConversationPreview as o, type ConversationPreviewProps as p, type ConversationSimulatorClient as q, ConversationSimulatorPanel as r, type ConversationSimulatorPanelLabels as s, type ConversationSimulatorPanelProps as t, type ConversationSummary as u, type ConversationTemplate as v, type ConversationVariable as w, type ConversationsApi as x, type ConversationsFeatures as y, type ConversationsTheme as z };
906
+ export { type ListDocumentsParams as $, AudioRecorderButton as A, acceptsMediaKind as B, type ConversationSummary as C, DEFAULT_AUDIO_RECORDER_BUTTON_LABELS as D, assertPreviewEnvironment as E, createPreviewMediaPoster as F, createPreviewMediaUploader as G, createPreviewWebhookClient as H, isConversationSimulatorClient as I, mediaKindOf as J, mediaTypeOf as K, type ListConversationsParams as L, type MessagePayload as M, signPreviewPayload as N, simulatorPanelLabelsOf as O, type PreviewUploadedMedia$1 as P, toConversationSimulatorClient as Q, type ResolveMediaUrl as R, type SSEProvider as S, type ToSimulatorClientParams as T, type InteractiveSelection as U, type MessageTranscription as V, type InteractivePayload as W, type ConversationsFeatures as X, type QuickReply as Y, type ConversationChannel as Z, type TranscriptionMode as _, type ConversationEventSource as a, type ConversationTemplate as a0, type QueuedAttachment as a1, type QuickReplyInput as a2, type QuickReplyAttachment as a3, type ConversationVariable as a4, type ChannelFilter as a5, type ChannelFilterOption as a6, CHANNEL_CAPABILITIES as a7, CHANNEL_FILTER_ALL as a8, CONVERSATION_CHANNEL as a9, type ChannelCapabilities as aa, type CompanyDocument as ab, type CompanyDocumentPage as ac, type ConversationDocumentPage as ad, type ConversationsTheme as ae, type ConversationsUIConfig as af, DEFAULT_CONVERSATION_CHANNEL as ag, DEFAULT_MAX_RECORDING_MILLISECONDS as ah, type FormatContactHandleParams as ai, HANDLE_KIND as aj, type HandleKind as ak, type InteractiveOption as al, type InteractiveSection as am, MediaRenderer as an, type MediaRendererProps as ao, QUICK_REPLY_ATTACHMENT_LIMIT as ap, REOPEN_MECHANISM as aq, type ReopenMechanism as ar, type StoredAttachmentSendResult as as, type TranscriptionStatus as at, capabilitiesOf as au, channelFiltersFor as av, contactFlag as aw, formatContactHandle as ax, type ConversationsApi as b, type ConversationPage as c, type ConversationDocument as d, type SendPreviewMediaParams as e, type PreviewWebhookClient as f, type AudioRecorderButtonLabels as g, type AudioRecorderButtonProps as h, ConversationPreview as i, type ConversationPreviewProps as j, type ConversationSimulatorClient as k, ConversationSimulatorPanel as l, type ConversationSimulatorPanelLabels as m, type ConversationSimulatorPanelProps as n, type CreatePreviewMediaUploaderParams as o, type CreatePreviewWebhookClientParams as p, DEFAULT_CONVERSATION_SIMULATOR_PANEL_LABELS as q, DEFAULT_MEDIA_UPLOAD_PATH as r, PreviewInProductionError as s, PreviewMediaUploadRejectedError as t, type PreviewMediaUploadRequest as u, type PreviewUploadedMedia as v, PreviewWebhookRejectedError as w, SIMULATOR_FILE_MEDIA_KINDS as x, type SendSimulatorMediaParams as y, type SimulatorMediaKind as z };
@@ -1,3 +1,7 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-PJNR6UMN.js";
4
+
1
5
  // src/Tooltip.tsx
2
6
  import { useEffect, useRef, useState } from "react";
3
7
  import { createPortal } from "react-dom";
@@ -104,7 +108,20 @@ function TooltipLayer() {
104
108
  );
105
109
  }
106
110
 
111
+ // src/lib/WhatsAppMessagePreview.tsx
112
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
113
+ function WhatsAppMessagePreview({ children, belowBubble, footer, className }) {
114
+ return /* @__PURE__ */ jsxs("div", { className: cn("rounded-xl bg-[#e5ddd5] dark:bg-gray-900 p-3 space-y-1.5", className), children: [
115
+ /* @__PURE__ */ jsxs("div", { className: "max-w-[85%]", children: [
116
+ /* @__PURE__ */ jsx2("div", { className: "rounded-lg rounded-tl-none bg-white dark:bg-gray-700 px-3 py-2 text-sm text-gray-900 dark:text-gray-100 shadow-sm whitespace-pre-wrap break-words", children }),
117
+ belowBubble
118
+ ] }),
119
+ footer
120
+ ] });
121
+ }
122
+
107
123
  export {
108
124
  TOOLTIP_ATTRIBUTE,
109
- TooltipLayer
125
+ TooltipLayer,
126
+ WhatsAppMessagePreview
110
127
  };
@@ -1,7 +1,8 @@
1
1
  import {
2
+ cn,
2
3
  parseWhatsAppFormatting,
3
4
  useIsDarkTheme
4
- } from "./chunk-WCBDXZ3X.js";
5
+ } from "./chunk-PJNR6UMN.js";
5
6
 
6
7
  // src/ConversationLocalesProvider.tsx
7
8
  import { createContext, useContext } from "react";
@@ -189,15 +190,6 @@ function AudioPlayer({ src, isMine = false }) {
189
190
  // src/AudioTranscription.tsx
190
191
  import { useCallback, useState as useState2 } from "react";
191
192
  import { Check, Copy, FileText, Loader2, RefreshCw } from "lucide-react";
192
-
193
- // src/lib/cn.ts
194
- import { clsx } from "clsx";
195
- import { twMerge } from "tailwind-merge";
196
- function cn(...inputs) {
197
- return twMerge(clsx(inputs));
198
- }
199
-
200
- // src/AudioTranscription.tsx
201
193
  import { Fragment, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
202
194
  var COPIED_FEEDBACK_MS = 2e3;
203
195
  var COLLAPSE_ABOVE_CHARS = 320;
@@ -655,18 +647,15 @@ function InteractiveMessage({ payload, onSelect, labels, className }) {
655
647
  const hasRows = collectRows(payload).length > 0;
656
648
  const isInteractable = onSelect !== void 0;
657
649
  return /* @__PURE__ */ jsxs6("div", { className: cn("flex flex-col gap-1", className), children: [
658
- payload.header?.text ? /* @__PURE__ */ jsx8("p", { className: cn("text-sm font-semibold text-gray-900 dark:text-gray-100", FORMATTING_CLASSES), children: parseWhatsAppFormatting(payload.header.text) }) : null,
650
+ payload.header?.text ? /* @__PURE__ */ jsx8("div", { className: cn("text-sm font-semibold text-gray-900 dark:text-gray-100", FORMATTING_CLASSES), children: parseWhatsAppFormatting(payload.header.text) }) : null,
659
651
  payload.body?.text ? /* @__PURE__ */ jsx8(
660
- "p",
652
+ "div",
661
653
  {
662
- className: cn(
663
- "whitespace-pre-wrap break-words text-sm text-gray-900 dark:text-gray-100",
664
- FORMATTING_CLASSES
665
- ),
654
+ className: cn("whitespace-pre-wrap break-words text-sm text-gray-900 dark:text-gray-100", FORMATTING_CLASSES),
666
655
  children: parseWhatsAppFormatting(payload.body.text)
667
656
  }
668
657
  ) : null,
669
- payload.footer?.text ? /* @__PURE__ */ jsx8("p", { className: cn("text-xs text-gray-500 dark:text-gray-400", FORMATTING_CLASSES), children: parseWhatsAppFormatting(payload.footer.text) }) : null,
658
+ payload.footer?.text ? /* @__PURE__ */ jsx8("div", { className: cn("text-xs text-gray-500 dark:text-gray-400", FORMATTING_CLASSES), children: parseWhatsAppFormatting(payload.footer.text) }) : null,
670
659
  buttons.length > 0 ? /* @__PURE__ */ jsx8("div", { className: "mt-1 flex flex-col gap-1 border-t border-gray-200 pt-1 dark:border-gray-700", children: buttons.map((button) => /* @__PURE__ */ jsx8(
671
660
  "button",
672
661
  {
@@ -1372,7 +1361,18 @@ var DEFAULT_QUICK_REPLIES_WORKSPACE_LABELS = {
1372
1361
  attachmentMoveDown: "Mover para baixo",
1373
1362
  attachmentLimitReached: "Limite de 10 anexos por mensagem.",
1374
1363
  attachmentTooLarge: (filename) => `${filename}: excede o tamanho m\xE1ximo para o tipo de arquivo.`,
1375
- saveBlockedUploading: "Aguardando o envio dos anexos\u2026"
1364
+ saveBlockedUploading: "Aguardando o envio dos anexos\u2026",
1365
+ formatBold: "Negrito",
1366
+ formatItalic: "It\xE1lico",
1367
+ formatStrikethrough: "Tachado",
1368
+ formatMonospace: "Monoespa\xE7ado",
1369
+ formatInlineCode: "C\xF3digo",
1370
+ formatBulletedList: "Lista",
1371
+ formatNumberedList: "Lista numerada",
1372
+ formatQuote: "Cita\xE7\xE3o",
1373
+ formattingToolbar: "Formata\xE7\xE3o do texto",
1374
+ previewTitle: "Pr\xE9-visualiza\xE7\xE3o no WhatsApp",
1375
+ previewEmptyBody: "Digite o texto para ver como a mensagem chega ao cliente."
1376
1376
  };
1377
1377
 
1378
1378
  // src/quickReplies/QuickRepliesPicker.tsx
@@ -3152,7 +3152,6 @@ export {
3152
3152
  useConversationLocales,
3153
3153
  StatusTicks,
3154
3154
  AudioPlayer,
3155
- cn,
3156
3155
  AudioTranscription,
3157
3156
  FileIcon,
3158
3157
  formatTimestamp,
@@ -1,5 +1,5 @@
1
1
  // src/lib/whatsapp-formatting.tsx
2
- import { jsx } from "react/jsx-runtime";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  var MONOSPACE_REGEX = /```([\s\S]*?)```/g;
4
4
  function tokenize(text) {
5
5
  const tokens = [];
@@ -24,7 +24,7 @@ function tokenize(text) {
24
24
  i += skip.length;
25
25
  continue;
26
26
  }
27
- const inlineMatch = remaining.slice(i).match(/^`([^`]+)`/);
27
+ const inlineMatch = remaining.slice(i).match(/^`([^`\n]+)`/);
28
28
  if (inlineMatch && inlineMatch.index === 0) {
29
29
  if (buffer) {
30
30
  tokens.push(...parseInlineTokens(buffer));
@@ -46,19 +46,19 @@ function parseInlineTokens(text) {
46
46
  const result = [];
47
47
  let remaining = text;
48
48
  while (remaining.length > 0) {
49
- const boldMatch = remaining.match(/^\*([^*]+)\*/);
49
+ const boldMatch = remaining.match(/^\*([^*\n]+)\*/);
50
50
  if (boldMatch) {
51
51
  result.push({ type: "bold", content: boldMatch[1] });
52
52
  remaining = remaining.slice(boldMatch[0].length);
53
53
  continue;
54
54
  }
55
- const italicMatch = remaining.match(/^_([^_]+)_/);
55
+ const italicMatch = remaining.match(/^_([^_\n]+)_/);
56
56
  if (italicMatch) {
57
57
  result.push({ type: "italic", content: italicMatch[1] });
58
58
  remaining = remaining.slice(italicMatch[0].length);
59
59
  continue;
60
60
  }
61
- const strikeMatch = remaining.match(/^~([^~]+)~/);
61
+ const strikeMatch = remaining.match(/^~([^~\n]+)~/);
62
62
  if (strikeMatch) {
63
63
  result.push({ type: "strikethrough", content: strikeMatch[1] });
64
64
  remaining = remaining.slice(strikeMatch[0].length);
@@ -79,8 +79,59 @@ function parseInlineTokens(text) {
79
79
  }
80
80
  return result;
81
81
  }
82
+ var BULLETED_LINE = /^[*-] (.*)$/;
83
+ var NUMBERED_LINE = /^(\d+)\. (.*)$/;
84
+ var QUOTE_LINE = /^> (.*)$/;
85
+ function blockKindOf(line) {
86
+ if (BULLETED_LINE.test(line)) return "bulleted";
87
+ if (NUMBERED_LINE.test(line)) return "numbered";
88
+ if (QUOTE_LINE.test(line)) return "quote";
89
+ return "plain";
90
+ }
91
+ function groupLines(lines) {
92
+ const groups = [];
93
+ for (const line of lines) {
94
+ const kind = blockKindOf(line);
95
+ const last = groups[groups.length - 1];
96
+ if (last && last.kind === kind) last.lines.push(line);
97
+ else groups.push({ kind, lines: [line] });
98
+ }
99
+ return groups;
100
+ }
101
+ function renderBlockGroup(group, key) {
102
+ if (group.kind === "bulleted") {
103
+ return /* @__PURE__ */ jsx("ul", { className: "list-disc pl-5", children: group.lines.map((line, index) => /* @__PURE__ */ jsx("li", { children: renderTokens(tokenize(line.replace(BULLETED_LINE, "$1"))) }, index)) }, key);
104
+ }
105
+ if (group.kind === "numbered") {
106
+ return /* @__PURE__ */ jsx("ol", { className: "list-decimal pl-6", children: group.lines.map((line, index) => {
107
+ const [, number, content] = NUMBERED_LINE.exec(line) ?? [];
108
+ return /* @__PURE__ */ jsx("li", { value: Number(number), children: renderTokens(tokenize(content ?? "")) }, index);
109
+ }) }, key);
110
+ }
111
+ if (group.kind === "quote") {
112
+ return /* @__PURE__ */ jsx(
113
+ "blockquote",
114
+ {
115
+ className: "border-l-4 border-gray-300 pl-2 text-gray-600 dark:border-gray-500 dark:text-gray-300",
116
+ children: group.lines.map((line, index) => /* @__PURE__ */ jsx("div", { children: renderTokens(tokenize(line.replace(QUOTE_LINE, "$1"))) }, index))
117
+ },
118
+ key
119
+ );
120
+ }
121
+ const joined = group.lines.join("\n");
122
+ const trailingBreak = group.lines[group.lines.length - 1] === "" ? "\n" : null;
123
+ return /* @__PURE__ */ jsxs("div", { children: [
124
+ renderTokens(tokenize(joined)),
125
+ trailingBreak
126
+ ] }, key);
127
+ }
82
128
  function parseWhatsAppFormatting(text) {
83
- const tokens = tokenize(text);
129
+ const lines = text.split("\n");
130
+ const hasBlockLine = lines.some((line) => blockKindOf(line) !== "plain");
131
+ if (!hasBlockLine || text.includes("```")) return renderTokens(tokenize(text));
132
+ return groupLines(lines).map(renderBlockGroup);
133
+ }
134
+ function renderTokens(tokens) {
84
135
  return tokens.map((token, index) => {
85
136
  switch (token.type) {
86
137
  case "bold":
@@ -139,8 +190,14 @@ function htmlToWA(html) {
139
190
  if (!html) return "";
140
191
  let text = html;
141
192
  text = text.replace(EMPTY_CODE_REGEX, "");
142
- text = text.replace(/<code data-wa="block"[^>]*>([\s\S]*?)<\/code>/gi, (_match, inner) => `\`\`\`${unescapeHtml(inner.replace(/<br\s*\/?>/gi, "\n"))}\`\`\``);
143
- text = text.replace(/<code data-wa="inline"[^>]*>([\s\S]*?)<\/code>/gi, (_match, inner) => `\`${unescapeHtml(inner)}\``);
193
+ text = text.replace(
194
+ /<code data-wa="block"[^>]*>([\s\S]*?)<\/code>/gi,
195
+ (_match, inner) => `\`\`\`${unescapeHtml(inner.replace(/<br\s*\/?>/gi, "\n"))}\`\`\``
196
+ );
197
+ text = text.replace(
198
+ /<code data-wa="inline"[^>]*>([\s\S]*?)<\/code>/gi,
199
+ (_match, inner) => `\`${unescapeHtml(inner)}\``
200
+ );
144
201
  text = text.replace(/<br\s*\/?>/gi, "\n").replace(/<div>/gi, "\n").replace(/<\/div>/gi, "").replace(/<\/p>/gi, "\n").replace(/<p[^>]*>/gi, "");
145
202
  text = text.replace(/<strong>(.*?)<\/strong>/gi, "*$1*");
146
203
  text = text.replace(/<b>(.*?)<\/b>/gi, "*$1*");
@@ -212,7 +269,15 @@ function useDarkMode() {
212
269
  return { isDark, toggle };
213
270
  }
214
271
 
272
+ // src/lib/cn.ts
273
+ import { clsx } from "clsx";
274
+ import { twMerge } from "tailwind-merge";
275
+ function cn(...inputs) {
276
+ return twMerge(clsx(inputs));
277
+ }
278
+
215
279
  export {
280
+ cn,
216
281
  parseWhatsAppFormatting,
217
282
  ZERO_WIDTH_SPACE,
218
283
  waToHTML,
@@ -1,10 +1,11 @@
1
1
  import {
2
- TooltipLayer
3
- } from "../chunk-DKPXKQGC.js";
2
+ TooltipLayer,
3
+ WhatsAppMessagePreview
4
+ } from "../chunk-HMCOTZAX.js";
4
5
  import {
5
6
  parseWhatsAppFormatting,
6
7
  useIsDarkTheme
7
- } from "../chunk-WCBDXZ3X.js";
8
+ } from "../chunk-PJNR6UMN.js";
8
9
 
9
10
  // src/flows/FlowNodeCard.tsx
10
11
  import { useState } from "react";
@@ -1244,7 +1245,7 @@ import { Plus as Plus3, Trash2, Save, X as X3, AlertTriangle as AlertTriangle2,
1244
1245
 
1245
1246
  // src/flows/FlowWhatsAppPreview.tsx
1246
1247
  import { List } from "lucide-react";
1247
- import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
1248
+ import { Fragment as Fragment3, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
1248
1249
  function FlowWhatsAppPreview({
1249
1250
  body,
1250
1251
  options,
@@ -1255,35 +1256,38 @@ function FlowWhatsAppPreview({
1255
1256
  }
1256
1257
  const usesButtons = rendersAsButtons(options);
1257
1258
  const hasOptions = (options?.length ?? 0) > 0;
1258
- return /* @__PURE__ */ jsxs9("div", { className: "rounded-xl bg-[#e5ddd5] dark:bg-gray-900 p-3 space-y-1.5", children: [
1259
- /* @__PURE__ */ jsxs9("div", { className: "max-w-[85%]", children: [
1260
- /* @__PURE__ */ jsxs9("div", { className: "rounded-lg rounded-tl-none bg-white dark:bg-gray-700 px-3 py-2 text-sm text-gray-900 dark:text-gray-100 shadow-sm whitespace-pre-wrap break-words", children: [
1259
+ return /* @__PURE__ */ jsxs9(
1260
+ WhatsAppMessagePreview,
1261
+ {
1262
+ belowBubble: /* @__PURE__ */ jsxs9(Fragment3, { children: [
1263
+ hasOptions && usesButtons && /* @__PURE__ */ jsx10("div", { className: "mt-1 space-y-1", children: options.map(([id, label]) => /* @__PURE__ */ jsx10(
1264
+ "div",
1265
+ {
1266
+ className: "rounded-lg bg-white dark:bg-gray-700 py-1.5 text-center text-sm font-medium text-cyan-600 dark:text-cyan-400 shadow-sm",
1267
+ children: label || /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyOption })
1268
+ },
1269
+ id
1270
+ )) }),
1271
+ hasOptions && !usesButtons && /* @__PURE__ */ jsx10("div", { className: "mt-1.5 rounded-lg bg-white dark:bg-gray-700 shadow-sm divide-y divide-gray-100 dark:divide-gray-600 overflow-hidden", children: options.slice(0, WHATSAPP_LIMITS.MAX_LIST_ROWS).map(([id, label]) => /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 px-3 py-1.5 text-sm text-gray-800 dark:text-gray-100", children: [
1272
+ /* @__PURE__ */ jsx10("span", { className: "h-3.5 w-3.5 rounded-full border border-gray-300 dark:border-gray-500 shrink-0" }),
1273
+ label || /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyOption })
1274
+ ] }, id)) })
1275
+ ] }),
1276
+ footer: hasOptions && /* @__PURE__ */ jsx10("p", { className: "text-[11px] text-gray-500 dark:text-gray-400 px-1", children: usesButtons ? labels.previewModeButtons : labels.previewModeList }),
1277
+ children: [
1261
1278
  body ? parseWhatsAppFormatting(body) : /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyBody }),
1262
1279
  hasOptions && !usesButtons && /* @__PURE__ */ jsx10("div", { className: "mt-2 -mx-3 -mb-2 border-t border-gray-100 dark:border-gray-600", children: /* @__PURE__ */ jsxs9("div", { className: "flex items-center justify-center gap-1.5 py-2 text-sm font-medium text-cyan-600 dark:text-cyan-400", children: [
1263
1280
  /* @__PURE__ */ jsx10(List, { size: 15 }),
1264
1281
  " ",
1265
1282
  labels.previewListButton
1266
1283
  ] }) })
1267
- ] }),
1268
- hasOptions && usesButtons && /* @__PURE__ */ jsx10("div", { className: "mt-1 space-y-1", children: options.map(([id, label]) => /* @__PURE__ */ jsx10(
1269
- "div",
1270
- {
1271
- className: "rounded-lg bg-white dark:bg-gray-700 py-1.5 text-center text-sm font-medium text-cyan-600 dark:text-cyan-400 shadow-sm",
1272
- children: label || /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyOption })
1273
- },
1274
- id
1275
- )) }),
1276
- hasOptions && !usesButtons && /* @__PURE__ */ jsx10("div", { className: "mt-1.5 rounded-lg bg-white dark:bg-gray-700 shadow-sm divide-y divide-gray-100 dark:divide-gray-600 overflow-hidden", children: options.slice(0, WHATSAPP_LIMITS.MAX_LIST_ROWS).map(([id, label]) => /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 px-3 py-1.5 text-sm text-gray-800 dark:text-gray-100", children: [
1277
- /* @__PURE__ */ jsx10("span", { className: "h-3.5 w-3.5 rounded-full border border-gray-300 dark:border-gray-500 shrink-0" }),
1278
- label || /* @__PURE__ */ jsx10("span", { className: "italic text-gray-400", children: labels.previewEmptyOption })
1279
- ] }, id)) })
1280
- ] }),
1281
- hasOptions && /* @__PURE__ */ jsx10("p", { className: "text-[11px] text-gray-500 dark:text-gray-400 px-1", children: usesButtons ? labels.previewModeButtons : labels.previewModeList })
1282
- ] });
1284
+ ]
1285
+ }
1286
+ );
1283
1287
  }
1284
1288
 
1285
1289
  // src/flows/FlowNodePanel.tsx
1286
- import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
1290
+ import { Fragment as Fragment4, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
1287
1291
  var SELECT_CLASSNAME = "border border-gray-200 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100 rounded-xl px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400 focus:border-transparent transition-all";
1288
1292
  var INPUT_CLASSNAME = "border border-gray-200 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100 rounded-xl px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400 focus:border-transparent transition-all";
1289
1293
  function truncateLabel(value, max = 60) {
@@ -1387,7 +1391,7 @@ function FlowNodePanel({
1387
1391
  setDraft((prev) => ({ ...prev, options: (prev.options ?? []).filter((_, i) => i !== index) }));
1388
1392
  }
1389
1393
  function nextNodeOptions() {
1390
- return /* @__PURE__ */ jsxs10(Fragment3, { children: [
1394
+ return /* @__PURE__ */ jsxs10(Fragment4, { children: [
1391
1395
  otherNodeIds.map((id) => /* @__PURE__ */ jsx11("option", { value: id, children: truncateLabel(nodeLabel(graph.nodes[id], labels)) }, id)),
1392
1396
  otherFlows.length > 0 && /* @__PURE__ */ jsx11("optgroup", { label: labels.nodePanel.otherFlowsGroup, children: otherFlows.map((flow) => /* @__PURE__ */ jsx11("option", { value: `${CROSS_FLOW_PREFIX}${flow.key}`, children: flow.label }, flow.key)) })
1393
1397
  ] });
@@ -1929,7 +1933,7 @@ function findFreeSlot(params) {
1929
1933
  }
1930
1934
 
1931
1935
  // src/flows/FlowsWorkspace.tsx
1932
- import { Fragment as Fragment4, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
1936
+ import { Fragment as Fragment5, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
1933
1937
  var RF_NODE_TYPES = {
1934
1938
  ...flowNodeTypes,
1935
1939
  ...flowPortalNodeTypes,
@@ -2552,7 +2556,7 @@ function FlowsWorkspace({
2552
2556
  ]
2553
2557
  }
2554
2558
  ),
2555
- viewMode === "detail" && /* @__PURE__ */ jsxs11(Fragment4, { children: [
2559
+ viewMode === "detail" && /* @__PURE__ */ jsxs11(Fragment5, { children: [
2556
2560
  /* @__PURE__ */ jsxs11(
2557
2561
  "button",
2558
2562
  {
@@ -2727,7 +2731,7 @@ function FlowsWorkspace({
2727
2731
  }
2728
2732
  )
2729
2733
  ] }),
2730
- quickAddFrom && /* @__PURE__ */ jsxs11(Fragment4, { children: [
2734
+ quickAddFrom && /* @__PURE__ */ jsxs11(Fragment5, { children: [
2731
2735
  /* @__PURE__ */ jsx12("div", { className: "fixed inset-0 z-40", onClick: () => setQuickAddFrom(null) }),
2732
2736
  /* @__PURE__ */ jsxs11(
2733
2737
  "div",
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import react__default, { ReactNode, CSSProperties, UIEvent, FormEvent, RefObject, KeyboardEvent } from 'react';
3
- import { V as MessagePayload, a9 as ResolveMediaUrl, Q as InteractiveSelection, W as MessageTranscription, O as InteractivePayload, y as ConversationsFeatures, a4 as QuickReply$1, u as ConversationSummary, j as ConversationChannel, R as ListConversationsParams, x as ConversationsApi, ab as SSEProvider, ah as TranscriptionMode, S as ListDocumentsParams, k as ConversationDocument, v as ConversationTemplate, a3 as QueuedAttachment, a6 as QuickReplyInput, a5 as QuickReplyAttachment, w as ConversationVariable, f as ChannelFilter, g as ChannelFilterOption, q as ConversationSimulatorClient, s as ConversationSimulatorPanelLabels, _ as PreviewUploadedMedia } from './ConversationSimulatorPanel-ikgmlciE.js';
4
- export { A as AudioRecorderButton, a as AudioRecorderButtonLabels, b as AudioRecorderButtonProps, C as CHANNEL_CAPABILITIES, c as CHANNEL_FILTER_ALL, d as CONVERSATION_CHANNEL, e as ChannelCapabilities, h as CompanyDocument, i as CompanyDocumentPage, l as ConversationDocumentPage, m as ConversationEventSource, n as ConversationPage, z as ConversationsTheme, B as ConversationsUIConfig, F as DEFAULT_AUDIO_RECORDER_BUTTON_LABELS, G as DEFAULT_CONVERSATION_CHANNEL, I as DEFAULT_MAX_RECORDING_MILLISECONDS, K as FormatContactHandleParams, L as HANDLE_KIND, M as HandleKind, N as InteractiveOption, P as InteractiveSection, T as MediaRenderer, U as MediaRendererProps, a2 as QUICK_REPLY_ATTACHMENT_LIMIT, a7 as REOPEN_MECHANISM, a8 as ReopenMechanism, ad as SendSimulatorMediaParams, ae as SimulatorMediaKind, af as StoredAttachmentSendResult, ai as TranscriptionStatus, al as capabilitiesOf, am as channelFiltersFor, an as contactFlag, ar as formatContactHandle } from './ConversationSimulatorPanel-ikgmlciE.js';
3
+ import { M as MessagePayload, R as ResolveMediaUrl, U as InteractiveSelection, V as MessageTranscription, W as InteractivePayload, X as ConversationsFeatures, Y as QuickReply$1, C as ConversationSummary, Z as ConversationChannel, L as ListConversationsParams, b as ConversationsApi, S as SSEProvider, _ as TranscriptionMode, $ as ListDocumentsParams, d as ConversationDocument, a0 as ConversationTemplate, a1 as QueuedAttachment, a2 as QuickReplyInput, a3 as QuickReplyAttachment, a4 as ConversationVariable, a5 as ChannelFilter, a6 as ChannelFilterOption, k as ConversationSimulatorClient, m as ConversationSimulatorPanelLabels, P as PreviewUploadedMedia } from './ConversationSimulatorPanel-DmV8uaFE.js';
4
+ export { A as AudioRecorderButton, g as AudioRecorderButtonLabels, h as AudioRecorderButtonProps, a7 as CHANNEL_CAPABILITIES, a8 as CHANNEL_FILTER_ALL, a9 as CONVERSATION_CHANNEL, aa as ChannelCapabilities, ab as CompanyDocument, ac as CompanyDocumentPage, ad as ConversationDocumentPage, a as ConversationEventSource, c as ConversationPage, ae as ConversationsTheme, af as ConversationsUIConfig, D as DEFAULT_AUDIO_RECORDER_BUTTON_LABELS, ag as DEFAULT_CONVERSATION_CHANNEL, ah as DEFAULT_MAX_RECORDING_MILLISECONDS, ai as FormatContactHandleParams, aj as HANDLE_KIND, ak as HandleKind, al as InteractiveOption, am as InteractiveSection, an as MediaRenderer, ao as MediaRendererProps, ap as QUICK_REPLY_ATTACHMENT_LIMIT, aq as REOPEN_MECHANISM, ar as ReopenMechanism, y as SendSimulatorMediaParams, z as SimulatorMediaKind, as as StoredAttachmentSendResult, at as TranscriptionStatus, au as capabilitiesOf, av as channelFiltersFor, aw as contactFlag, ax as formatContactHandle } from './ConversationSimulatorPanel-DmV8uaFE.js';
5
5
  import '@adatechnology/meta-whatsapp-contracts/testing';
6
6
 
7
7
  interface MessageBubbleProps {
@@ -252,8 +252,22 @@ interface QuickRepliesWorkspaceLabels {
252
252
  readonly attachmentLimitReached: string;
253
253
  readonly attachmentTooLarge: (filename: string) => string;
254
254
  readonly saveBlockedUploading: string;
255
- }
256
- declare const DEFAULT_QUICK_REPLIES_WORKSPACE_LABELS: QuickRepliesWorkspaceLabels;
255
+ /** Barra de formatação acima do campo de texto — notação do WhatsApp. */
256
+ readonly formatBold?: string;
257
+ readonly formatItalic?: string;
258
+ readonly formatStrikethrough?: string;
259
+ readonly formatMonospace?: string;
260
+ readonly formatInlineCode?: string;
261
+ readonly formatBulletedList?: string;
262
+ readonly formatNumberedList?: string;
263
+ readonly formatQuote?: string;
264
+ readonly formattingToolbar?: string;
265
+ readonly previewTitle?: string;
266
+ readonly previewEmptyBody?: string;
267
+ }
268
+ /** Os rótulos já completados pelos padrões — as chaves novas são opcionais no tipo público. */
269
+ type ResolvedQuickRepliesWorkspaceLabels = Required<QuickRepliesWorkspaceLabels>;
270
+ declare const DEFAULT_QUICK_REPLIES_WORKSPACE_LABELS: ResolvedQuickRepliesWorkspaceLabels;
257
271
 
258
272
  /**
259
273
  * Mensagem pronta que o atendente cola no campo com um clique.
@@ -1707,11 +1721,36 @@ interface UseInboxActionsResult {
1707
1721
  /** Ações que valem para a caixa inteira, sem conversa selecionada. */
1708
1722
  declare function useInboxActions(): UseInboxActionsResult;
1709
1723
 
1724
+ /**
1725
+ * Formatação do WhatsApp: inline (`*`, `_`, `~`, `` ` ``, ```` ``` ````) e, por linha, lista (`* `,
1726
+ * `- `), lista numerada (`1. `) e citação (`> `). Sem linha de bloco, a saída é só inline, igual à de
1727
+ * sempre. Com bloco de código de várias linhas, também — dividir por linha partiria o bloco.
1728
+ */
1710
1729
  declare function parseWhatsAppFormatting(text: string): ReactNode[];
1711
1730
  declare function waToHTML(text: string): string;
1712
1731
  declare function htmlToWA(html: string): string;
1713
1732
  declare function waToHTMLInline(text: string): string;
1714
1733
 
1734
+ interface WhatsAppMessagePreviewProps {
1735
+ /** Conteúdo dentro do balão (texto já formatado, anexos, botão de lista). */
1736
+ readonly children: ReactNode;
1737
+ /** Abaixo do balão, ainda na coluna dele — botões de resposta, linhas de lista. */
1738
+ readonly belowBubble?: ReactNode;
1739
+ /** Rodapé fora da coluna do balão, sobre o fundo. */
1740
+ readonly footer?: ReactNode;
1741
+ readonly className?: string;
1742
+ }
1743
+ /** Balão recebido sobre o fundo do WhatsApp — o único estilo de pré-visualização do pacote. */
1744
+ declare function WhatsAppMessagePreview({ children, belowBubble, footer, className }: WhatsAppMessagePreviewProps): react.JSX.Element;
1745
+
1746
+ /** Notação do WhatsApp de cada ação — a mesma que `parseWhatsAppFormatting` reconhece. */
1747
+ declare const WHATSAPP_MARKER_BY_ACTION: {
1748
+ readonly bold: "*";
1749
+ readonly italic: "_";
1750
+ readonly strikethrough: "~";
1751
+ readonly monospace: "```";
1752
+ };
1753
+
1715
1754
  declare function formatPhone(number: string): string;
1716
1755
  declare function phoneInitials(number: string): string;
1717
1756
 
@@ -2214,4 +2253,4 @@ type QueuedAttachmentsListProps = {
2214
2253
  };
2215
2254
  declare function QueuedAttachmentsList({ items, statusOf, onRemove, onRetry, retryingKeys, getThumbnailUrl, labels, busy, }: QueuedAttachmentsListProps): react.JSX.Element | null;
2216
2255
 
2217
- export { type AsyncResourceState, type AttachmentFileRejection, AudioPlayer, type AudioPlayerProps, AudioTranscription, type AudioTranscriptionProps, Avatar, type AvatarLabels, type AvatarProps, type BotMessages, type BuildTranscriptTextParams, BulkActionBar, type BulkActionBarProps, CHANNEL_BRAND_COLOR, CONVERSATIONS_PER_PAGE, CONVERSATION_WINDOW, ChannelFilter, ChannelFilterOption, ChannelIcon, type ChannelIconProps, ConversationChannel, type ConversationContextEntry, ConversationContextPanel, type ConversationContextPanelClassNames, type ConversationContextPanelLabels, type ConversationContextPanelProps, type ConversationContextStatus, ConversationDocument, ConversationDocumentsPanel, type ConversationDocumentsPanelClassNames, type ConversationDocumentsPanelLabels, type ConversationDocumentsPanelProps, ConversationHeader, type ConversationHeaderClassNames, type ConversationHeaderLabels, type ConversationHeaderProps, type ConversationHeaderUtility, ConversationListItem, type ConversationListItemLabels, type ConversationListItemProps, type ConversationLocales, ConversationLocalesProvider, type ConversationLocalesProviderProps, ConversationPane, type ConversationPaneProps, type ConversationRealtimeHandler, ConversationRow, type ConversationRowClassNames, type ConversationRowProps, ConversationSimulatorClient, ConversationSummary, ConversationTemplate, ConversationVariable, ConversationWallpaper, type ConversationWallpaperProps, type ConversationWindow, ConversationsApi, ConversationsFeatures, ConversationsInboxList, type ConversationsInboxListProps, ConversationsProvider, ConversationsWorkspace, type ConversationsWorkspaceLabels, type ConversationsWorkspaceProps, type ConversationsWorkspaceSimulator, DEFAULT_ACCEPTED_FILE_TYPES, DEFAULT_AVATAR_LABELS, DEFAULT_CONVERSATIONS_WORKSPACE_LABELS, DEFAULT_CONVERSATION_CONTEXT_LABELS, DEFAULT_CONVERSATION_DOCUMENTS_LABELS, DEFAULT_CONVERSATION_HEADER_LABELS, DEFAULT_CONVERSATION_LIST_ITEM_LABELS, DEFAULT_DARK_MODE_TOGGLE_LABELS, DEFAULT_DOCUMENTS_LIBRARY_LABELS, DEFAULT_DOCUMENTS_WORKSPACE_LABELS, DEFAULT_EMOJI_PICKER_LABELS, DEFAULT_INTERACTIVE_MESSAGE_LABELS, DEFAULT_LIGHTBOX_LABELS, DEFAULT_MAX_ATTACHMENT_SIZE_BYTES, DEFAULT_MESSAGE_COMPOSER_LABELS, DEFAULT_QUICK_REPLIES_PICKER_LABELS, DEFAULT_QUICK_REPLIES_WORKSPACE_LABELS, DEFAULT_RICH_COMPOSER_TOOLTIPS, DEFAULT_TEMPLATES_SETTINGS_LABELS, DEFAULT_WHATSAPP_MESSAGE_EDITOR_LABELS, DEFAULT_WINDOW_EXPIRED_LABELS, DOCUMENT_SOURCE_FILTER, DarkModeToggle, type DarkModeToggleLabels, type DarkModeToggleProps, DateDivider, type DateDividerClassNames, type DateDividerProps, type DocumentSourceFilter, type DocumentsFiltersContext, DocumentsLibrary, type DocumentsLibraryClassNames, type DocumentsLibraryLabels, type DocumentsLibraryProps, DocumentsWorkspace, type DocumentsWorkspaceClassNames, type DocumentsWorkspaceLabels, type DocumentsWorkspaceProps, EMOJI_CATEGORIES, type EmojiCategory, type EmojiEntry, EmojiPicker, type EmojiPickerLabels, type EmojiPickerProps, FileIcon, type FileIconProps, type FilterOption, type FilterQuickRepliesParams, InteractiveMessage, type InteractiveMessageLabels, type InteractiveMessageProps, InteractivePayload, InteractiveSelection, Lightbox, type LightboxLabels, type LightboxProps, ListConversationsParams, ListDocumentsParams, ListingPagination, type ListingPaginationProps, type MatchSegment, type MaxAttachmentSizeBytes, MessageBubble, type MessageBubbleProps, MessageComposer, type MessageComposerClassNames, type MessageComposerLabels, type MessageComposerProps, MessagePayload, MessageTail, MessageText, type MessageTextProps, MessageTimestamp, MessageTranscription, MessagesWorkspace, type MessagesWorkspaceApi, type MessagesWorkspaceLabels, type MessagesWorkspaceProps, type MessagesWorkspaceTemplateRole, MultiSelectFilter, type MultiSelectFilterProps, NARROW_MAX_WIDTH_PX, type OutgoingItems, QueuedAttachment, QueuedAttachmentsList, QuickRepliesPicker, type QuickRepliesPickerLabels, type QuickRepliesPickerProps, QuickRepliesWorkspace, type QuickRepliesWorkspaceLabels, type QuickRepliesWorkspaceProps, type QuickReply, QuickReplyAttachment, QuickReplyInput, REPLY_LATENCY, REPLY_LATENCY_CRITICAL_HOURS, REPLY_LATENCY_LATE_HOURS, RICH_COMPOSER_ACTION, type ReplyLatency, type ReplyLatencyParams, ResolveMediaUrl, type RichComposerAction, type RichComposerQuickReply, type RichComposerTooltips, type RichComposerVariable, RichMessageComposer, type RichMessageComposerHandle, type RichMessageComposerProps, SSEProvider, QuickReply$1 as SavedQuickReply, SimpleEmojiPicker, type SimpleEmojiPickerProps, type SimulatorTransportFactory, type SimulatorTransportParams, type SortDirection, SortableHead, type SortableHeadProps, StatusTicks, type StatusTicksProps, TEMPLATE_SETTINGS_TAB, TOOLTIP_ATTRIBUTE, type TemplateSettings, type TemplateSettingsTab, ToastProvider, TooltipLayer, type TopicItem, TopicsForm, type TopicsFormLabels, type TopicsFormProps, TranscriptionMode, type TranscriptionSettings, TranscriptionSettingsForm, type TranscriptionSettingsFormLabels, type TranscriptionSettingsFormProps, type UrlStateOptions, type UseConversationActionsResult, type UseConversationContextResult, type UseConversationDocumentsParams, type UseConversationDocumentsResult, type UseConversationListParams, type UseConversationListResult, type UseConversationMessagesResult, type UseConversationsInboxParams, type UseConversationsInboxResult, type UseInboxActionsResult, type UseScrollToLatestMessageParams, type UseScrollToLatestMessageResult, type UseWaitingNotificationsLabels, type UseWaitingNotificationsParams, type UseWaitingNotificationsResult, type ValidateAttachmentFilesResult, WINDOW_FILTERS, WelcomeFarewellForm, type WelcomeFarewellFormLabels, type WelcomeFarewellFormProps, WhatsAppCreateTemplateForm, type WhatsAppCreateTemplateFormLabels, type WhatsAppCreateTemplateFormProps, type WhatsAppCreateTemplateResult, type WhatsAppCreateTemplateState, WhatsAppMessageEditor, type WhatsAppMessageEditorLabels, type WhatsAppMessageEditorProps, type WhatsAppTemplateHeaderType, WhatsAppTemplateSettingsForm, type WhatsAppTemplateSettingsFormLabels, type WhatsAppTemplateSettingsFormProps, type WhatsAppTemplateSummary, type WhatsAppTemplateVariableSuggestion, WhatsAppTemplatesSettings, type WhatsAppTemplatesSettingsLabels, type WhatsAppTemplatesSettingsProps, WindowExpiredNotice, type WindowExpiredNoticeLabels, type WindowExpiredNoticeProps, type WindowOfParams, applyQuickReplyVariables, buildTranscriptFilename, buildTranscriptText, createMediaUrlResolver, downloadTextFile, filterQuickReplies, formatDateTime, formatFileSize, formatPhone, formatStalledFor, formatTimestamp, highlightMatch, htmlToWA, isReplyOverdue, isSameDay, isWindowBlocking, normalizeForSearch, parseWhatsAppFormatting, phoneInitials, queuedAttachmentsFromQuickReply, replyLatencyOf, resolveMaxAttachmentSizeBytes, resolveQuickReply, searchEmojis, toast, useConversationActions, useConversationContext, useConversationDocuments, useConversationList, useConversationLocales, useConversationMessages, useConversationRealtime, useConversations, useConversationsInbox, useDarkMode, useDebouncedValue, useGlobalRealtime, useInboxActions, useIsDarkTheme, useIsNarrow, useScrollToLatestMessage, useToast, useUrlArrayState, useUrlNumberState, useUrlStringState, useWaitingNotifications, waToHTML, waToHTMLInline, windowOf };
2256
+ export { type AsyncResourceState, type AttachmentFileRejection, AudioPlayer, type AudioPlayerProps, AudioTranscription, type AudioTranscriptionProps, Avatar, type AvatarLabels, type AvatarProps, type BotMessages, type BuildTranscriptTextParams, BulkActionBar, type BulkActionBarProps, CHANNEL_BRAND_COLOR, CONVERSATIONS_PER_PAGE, CONVERSATION_WINDOW, ChannelFilter, ChannelFilterOption, ChannelIcon, type ChannelIconProps, ConversationChannel, type ConversationContextEntry, ConversationContextPanel, type ConversationContextPanelClassNames, type ConversationContextPanelLabels, type ConversationContextPanelProps, type ConversationContextStatus, ConversationDocument, ConversationDocumentsPanel, type ConversationDocumentsPanelClassNames, type ConversationDocumentsPanelLabels, type ConversationDocumentsPanelProps, ConversationHeader, type ConversationHeaderClassNames, type ConversationHeaderLabels, type ConversationHeaderProps, type ConversationHeaderUtility, ConversationListItem, type ConversationListItemLabels, type ConversationListItemProps, type ConversationLocales, ConversationLocalesProvider, type ConversationLocalesProviderProps, ConversationPane, type ConversationPaneProps, type ConversationRealtimeHandler, ConversationRow, type ConversationRowClassNames, type ConversationRowProps, ConversationSimulatorClient, ConversationSummary, ConversationTemplate, ConversationVariable, ConversationWallpaper, type ConversationWallpaperProps, type ConversationWindow, ConversationsApi, ConversationsFeatures, ConversationsInboxList, type ConversationsInboxListProps, ConversationsProvider, ConversationsWorkspace, type ConversationsWorkspaceLabels, type ConversationsWorkspaceProps, type ConversationsWorkspaceSimulator, DEFAULT_ACCEPTED_FILE_TYPES, DEFAULT_AVATAR_LABELS, DEFAULT_CONVERSATIONS_WORKSPACE_LABELS, DEFAULT_CONVERSATION_CONTEXT_LABELS, DEFAULT_CONVERSATION_DOCUMENTS_LABELS, DEFAULT_CONVERSATION_HEADER_LABELS, DEFAULT_CONVERSATION_LIST_ITEM_LABELS, DEFAULT_DARK_MODE_TOGGLE_LABELS, DEFAULT_DOCUMENTS_LIBRARY_LABELS, DEFAULT_DOCUMENTS_WORKSPACE_LABELS, DEFAULT_EMOJI_PICKER_LABELS, DEFAULT_INTERACTIVE_MESSAGE_LABELS, DEFAULT_LIGHTBOX_LABELS, DEFAULT_MAX_ATTACHMENT_SIZE_BYTES, DEFAULT_MESSAGE_COMPOSER_LABELS, DEFAULT_QUICK_REPLIES_PICKER_LABELS, DEFAULT_QUICK_REPLIES_WORKSPACE_LABELS, DEFAULT_RICH_COMPOSER_TOOLTIPS, DEFAULT_TEMPLATES_SETTINGS_LABELS, DEFAULT_WHATSAPP_MESSAGE_EDITOR_LABELS, DEFAULT_WINDOW_EXPIRED_LABELS, DOCUMENT_SOURCE_FILTER, DarkModeToggle, type DarkModeToggleLabels, type DarkModeToggleProps, DateDivider, type DateDividerClassNames, type DateDividerProps, type DocumentSourceFilter, type DocumentsFiltersContext, DocumentsLibrary, type DocumentsLibraryClassNames, type DocumentsLibraryLabels, type DocumentsLibraryProps, DocumentsWorkspace, type DocumentsWorkspaceClassNames, type DocumentsWorkspaceLabels, type DocumentsWorkspaceProps, EMOJI_CATEGORIES, type EmojiCategory, type EmojiEntry, EmojiPicker, type EmojiPickerLabels, type EmojiPickerProps, FileIcon, type FileIconProps, type FilterOption, type FilterQuickRepliesParams, InteractiveMessage, type InteractiveMessageLabels, type InteractiveMessageProps, InteractivePayload, InteractiveSelection, Lightbox, type LightboxLabels, type LightboxProps, ListConversationsParams, ListDocumentsParams, ListingPagination, type ListingPaginationProps, type MatchSegment, type MaxAttachmentSizeBytes, MessageBubble, type MessageBubbleProps, MessageComposer, type MessageComposerClassNames, type MessageComposerLabels, type MessageComposerProps, MessagePayload, MessageTail, MessageText, type MessageTextProps, MessageTimestamp, MessageTranscription, MessagesWorkspace, type MessagesWorkspaceApi, type MessagesWorkspaceLabels, type MessagesWorkspaceProps, type MessagesWorkspaceTemplateRole, MultiSelectFilter, type MultiSelectFilterProps, NARROW_MAX_WIDTH_PX, type OutgoingItems, QueuedAttachment, QueuedAttachmentsList, QuickRepliesPicker, type QuickRepliesPickerLabels, type QuickRepliesPickerProps, QuickRepliesWorkspace, type QuickRepliesWorkspaceLabels, type QuickRepliesWorkspaceProps, type QuickReply, QuickReplyAttachment, QuickReplyInput, REPLY_LATENCY, REPLY_LATENCY_CRITICAL_HOURS, REPLY_LATENCY_LATE_HOURS, RICH_COMPOSER_ACTION, type ReplyLatency, type ReplyLatencyParams, ResolveMediaUrl, type RichComposerAction, type RichComposerQuickReply, type RichComposerTooltips, type RichComposerVariable, RichMessageComposer, type RichMessageComposerHandle, type RichMessageComposerProps, SSEProvider, QuickReply$1 as SavedQuickReply, SimpleEmojiPicker, type SimpleEmojiPickerProps, type SimulatorTransportFactory, type SimulatorTransportParams, type SortDirection, SortableHead, type SortableHeadProps, StatusTicks, type StatusTicksProps, TEMPLATE_SETTINGS_TAB, TOOLTIP_ATTRIBUTE, type TemplateSettings, type TemplateSettingsTab, ToastProvider, TooltipLayer, type TopicItem, TopicsForm, type TopicsFormLabels, type TopicsFormProps, TranscriptionMode, type TranscriptionSettings, TranscriptionSettingsForm, type TranscriptionSettingsFormLabels, type TranscriptionSettingsFormProps, type UrlStateOptions, type UseConversationActionsResult, type UseConversationContextResult, type UseConversationDocumentsParams, type UseConversationDocumentsResult, type UseConversationListParams, type UseConversationListResult, type UseConversationMessagesResult, type UseConversationsInboxParams, type UseConversationsInboxResult, type UseInboxActionsResult, type UseScrollToLatestMessageParams, type UseScrollToLatestMessageResult, type UseWaitingNotificationsLabels, type UseWaitingNotificationsParams, type UseWaitingNotificationsResult, type ValidateAttachmentFilesResult, WHATSAPP_MARKER_BY_ACTION, WINDOW_FILTERS, WelcomeFarewellForm, type WelcomeFarewellFormLabels, type WelcomeFarewellFormProps, WhatsAppCreateTemplateForm, type WhatsAppCreateTemplateFormLabels, type WhatsAppCreateTemplateFormProps, type WhatsAppCreateTemplateResult, type WhatsAppCreateTemplateState, WhatsAppMessageEditor, type WhatsAppMessageEditorLabels, type WhatsAppMessageEditorProps, WhatsAppMessagePreview, type WhatsAppMessagePreviewProps, type WhatsAppTemplateHeaderType, WhatsAppTemplateSettingsForm, type WhatsAppTemplateSettingsFormLabels, type WhatsAppTemplateSettingsFormProps, type WhatsAppTemplateSummary, type WhatsAppTemplateVariableSuggestion, WhatsAppTemplatesSettings, type WhatsAppTemplatesSettingsLabels, type WhatsAppTemplatesSettingsProps, WindowExpiredNotice, type WindowExpiredNoticeLabels, type WindowExpiredNoticeProps, type WindowOfParams, applyQuickReplyVariables, buildTranscriptFilename, buildTranscriptText, createMediaUrlResolver, downloadTextFile, filterQuickReplies, formatDateTime, formatFileSize, formatPhone, formatStalledFor, formatTimestamp, highlightMatch, htmlToWA, isReplyOverdue, isSameDay, isWindowBlocking, normalizeForSearch, parseWhatsAppFormatting, phoneInitials, queuedAttachmentsFromQuickReply, replyLatencyOf, resolveMaxAttachmentSizeBytes, resolveQuickReply, searchEmojis, toast, useConversationActions, useConversationContext, useConversationDocuments, useConversationList, useConversationLocales, useConversationMessages, useConversationRealtime, useConversations, useConversationsInbox, useDarkMode, useDebouncedValue, useGlobalRealtime, useInboxActions, useIsDarkTheme, useIsNarrow, useScrollToLatestMessage, useToast, useUrlArrayState, useUrlNumberState, useUrlStringState, useWaitingNotifications, waToHTML, waToHTMLInline, windowOf };