@arbidocs/blocks 0.4.84 → 0.4.85

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 (114) hide show
  1. package/dist/MailBodyEditor-5PIQLYVY.js +217 -0
  2. package/dist/MailBodyEditor-5PIQLYVY.js.map +1 -0
  3. package/dist/MailBodyEditor-D7MGJMLH.cjs +223 -0
  4. package/dist/MailBodyEditor-D7MGJMLH.cjs.map +1 -0
  5. package/dist/agents/index.cjs +281 -280
  6. package/dist/agents/index.js +6 -5
  7. package/dist/agents/workflows/StepBarFrame.d.ts +3 -1
  8. package/dist/agents/workflows/WorkflowRunner.d.ts +10 -1
  9. package/dist/agents/workflows/run.d.ts +24 -3
  10. package/dist/agents/workflows/stepWindow.d.ts +4 -2
  11. package/dist/agents/workflows/types.d.ts +5 -0
  12. package/dist/agents/workflows/useWorkflowView.d.ts +16 -1
  13. package/dist/chat/index.cjs +1 -1
  14. package/dist/chat/index.js +1 -1
  15. package/dist/chunk-3R6XBYL7.cjs +576 -0
  16. package/dist/chunk-3R6XBYL7.cjs.map +1 -0
  17. package/dist/{chunk-CKB64Z4R.js → chunk-4XJZ6AAY.js} +6 -245
  18. package/dist/chunk-4XJZ6AAY.js.map +1 -0
  19. package/dist/{chunk-SB5ZKOYN.js → chunk-7C35WXYB.js} +4 -63
  20. package/dist/chunk-7C35WXYB.js.map +1 -0
  21. package/dist/chunk-7RJTEWYM.js +362 -0
  22. package/dist/chunk-7RJTEWYM.js.map +1 -0
  23. package/dist/chunk-AFSOUS5X.cjs +253 -0
  24. package/dist/chunk-AFSOUS5X.cjs.map +1 -0
  25. package/dist/{chunk-F4RUCUXF.cjs → chunk-C2HRZSAT.cjs} +2 -63
  26. package/dist/chunk-C2HRZSAT.cjs.map +1 -0
  27. package/dist/{chunk-RX35SMPR.js → chunk-FHOZMT5P.js} +7 -6
  28. package/dist/chunk-FHOZMT5P.js.map +1 -0
  29. package/dist/{chunk-CONIA2ZA.js → chunk-KHY4PYU7.js} +246 -146
  30. package/dist/chunk-KHY4PYU7.js.map +1 -0
  31. package/dist/chunk-LGX6UFYG.js +557 -0
  32. package/dist/chunk-LGX6UFYG.js.map +1 -0
  33. package/dist/chunk-O4YPVYPO.cjs +373 -0
  34. package/dist/chunk-O4YPVYPO.cjs.map +1 -0
  35. package/dist/chunk-R26OHONI.js +250 -0
  36. package/dist/chunk-R26OHONI.js.map +1 -0
  37. package/dist/{chunk-RYYYHPFU.cjs → chunk-RZUMQM7W.cjs} +246 -146
  38. package/dist/chunk-RZUMQM7W.cjs.map +1 -0
  39. package/dist/{chunk-YJQVLVBJ.cjs → chunk-S5HZBXZA.cjs} +2 -243
  40. package/dist/chunk-S5HZBXZA.cjs.map +1 -0
  41. package/dist/{chunk-ZQYE7J3J.cjs → chunk-WRSBM6QN.cjs} +332 -94
  42. package/dist/chunk-WRSBM6QN.cjs.map +1 -0
  43. package/dist/{chunk-RSKSXEPW.js → chunk-X23U6QEJ.js} +324 -88
  44. package/dist/chunk-X23U6QEJ.js.map +1 -0
  45. package/dist/{chunk-XA5S4776.cjs → chunk-Z7YUCYI6.cjs} +51 -50
  46. package/dist/chunk-Z7YUCYI6.cjs.map +1 -0
  47. package/dist/collaboration/index.cjs +100 -49
  48. package/dist/collaboration/index.js +4 -1
  49. package/dist/collaboration/mail/MailBodyEditor.d.ts +7 -0
  50. package/dist/collaboration/mail/MailDeliveryList.d.ts +8 -0
  51. package/dist/collaboration/mail/MailDocumentPicker.d.ts +15 -0
  52. package/dist/collaboration/mail/MailGrid.d.ts +17 -0
  53. package/dist/collaboration/mail/MailMessageView.d.ts +27 -0
  54. package/dist/collaboration/mail/PlainMailBodyEditor.d.ts +12 -0
  55. package/dist/collaboration/mail/index.d.ts +6 -0
  56. package/dist/collaboration/mail/mailCompose.d.ts +24 -0
  57. package/dist/connect/index.cjs +1647 -65
  58. package/dist/connect/index.cjs.map +1 -1
  59. package/dist/connect/index.d.ts +2 -1
  60. package/dist/connect/index.js +1631 -55
  61. package/dist/connect/index.js.map +1 -1
  62. package/dist/connection/ConnectedTagTable.d.ts +32 -0
  63. package/dist/connection/mail/ConnectedMailAccounts.d.ts +21 -0
  64. package/dist/connection/mail/ConnectedMailComposer.d.ts +40 -0
  65. package/dist/connection/mail/ConnectedMailSetup.d.ts +16 -0
  66. package/dist/connection/mail/ConnectedMailbox.d.ts +65 -0
  67. package/dist/connection/mail/MailComposerForm.d.ts +25 -0
  68. package/dist/connection/mail/attachments.d.ts +13 -0
  69. package/dist/connection/mail/index.d.ts +6 -0
  70. package/dist/connection/mail/mailbox.d.ts +6 -0
  71. package/dist/connection/mail/types.d.ts +92 -0
  72. package/dist/connection/useConnectedWorkNotifications.d.ts +6 -0
  73. package/dist/connection/useWorkflowThread.d.ts +7 -2
  74. package/dist/facts/index.cjs +2 -2
  75. package/dist/facts/index.js +2 -2
  76. package/dist/files/index.cjs +47 -367
  77. package/dist/files/index.cjs.map +1 -1
  78. package/dist/files/index.js +10 -360
  79. package/dist/files/index.js.map +1 -1
  80. package/dist/index.cjs +450 -391
  81. package/dist/index.cjs.map +1 -1
  82. package/dist/index.js +21 -18
  83. package/dist/index.js.map +1 -1
  84. package/dist/settings/index.cjs +10 -9
  85. package/dist/settings/index.cjs.map +1 -1
  86. package/dist/settings/index.js +2 -1
  87. package/dist/settings/index.js.map +1 -1
  88. package/dist/shell/index.cjs +1 -1
  89. package/dist/shell/index.js +1 -1
  90. package/dist/tags/TagColumnsEditor.d.ts +34 -0
  91. package/dist/tags/TagDetail.d.ts +13 -11
  92. package/dist/tags/TagTable.d.ts +99 -0
  93. package/dist/tags/TagsNav.d.ts +2 -2
  94. package/dist/tags/index.d.ts +7 -5
  95. package/dist/tags/{tagMatrixDocx.d.ts → tagTableDocx.d.ts} +12 -12
  96. package/dist/tags/tagTableModel.d.ts +47 -0
  97. package/dist/workflow-canvas/index.cjs +49 -48
  98. package/dist/workflow-canvas/index.cjs.map +1 -1
  99. package/dist/workflow-canvas/index.js +6 -5
  100. package/dist/workflow-canvas/index.js.map +1 -1
  101. package/package.json +29 -4
  102. package/dist/chunk-CKB64Z4R.js.map +0 -1
  103. package/dist/chunk-CONIA2ZA.js.map +0 -1
  104. package/dist/chunk-F4RUCUXF.cjs.map +0 -1
  105. package/dist/chunk-RSKSXEPW.js.map +0 -1
  106. package/dist/chunk-RX35SMPR.js.map +0 -1
  107. package/dist/chunk-RYYYHPFU.cjs.map +0 -1
  108. package/dist/chunk-SB5ZKOYN.js.map +0 -1
  109. package/dist/chunk-XA5S4776.cjs.map +0 -1
  110. package/dist/chunk-YJQVLVBJ.cjs.map +0 -1
  111. package/dist/chunk-ZQYE7J3J.cjs.map +0 -1
  112. package/dist/connection/ConnectedTagMatrix.d.ts +0 -23
  113. package/dist/tags/TagMatrix.d.ts +0 -87
  114. package/dist/tags/tagMatrixModel.d.ts +0 -43
@@ -0,0 +1,576 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkIXALYQT7_cjs = require('./chunk-IXALYQT7.cjs');
5
+ var lucideReact = require('lucide-react');
6
+ var ui = require('@arbidocs/react/ui');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var react = require('react');
9
+ var DOMPurify = require('dompurify');
10
+
11
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
+
13
+ var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
14
+
15
+ var DELIVERY_BADGE = {
16
+ bounced: {
17
+ label: "Bounced",
18
+ title: "Not delivered: the recipient's mail server sent this message back.",
19
+ tone: "bg-destructive/10 text-destructive"
20
+ },
21
+ partially_bounced: {
22
+ label: "Partly bounced",
23
+ title: "Some recipients did not get this message. Open it to see who.",
24
+ tone: "bg-destructive/10 text-destructive"
25
+ },
26
+ delayed: {
27
+ label: "Delayed",
28
+ title: "Delivery is delayed; the recipient's server will keep retrying.",
29
+ tone: "bg-muted text-muted-foreground"
30
+ }
31
+ };
32
+ function MailDeliveryBadge({
33
+ problem,
34
+ className
35
+ }) {
36
+ const badge = DELIVERY_BADGE[problem];
37
+ return /* @__PURE__ */ jsxRuntime.jsx(
38
+ "span",
39
+ {
40
+ className: ui.cn("shrink-0 rounded-full px-2 py-0.5 text-xs font-medium", badge.tone, className),
41
+ title: badge.title,
42
+ "data-testid": "mail-delivery-badge",
43
+ children: badge.label
44
+ }
45
+ );
46
+ }
47
+ function MailMessagePreview({
48
+ participants,
49
+ subject,
50
+ preview,
51
+ date,
52
+ dateTime,
53
+ unread,
54
+ hasAttachments,
55
+ deliveryProblem: deliveryProblem2
56
+ }) {
57
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full w-full min-w-0 flex-col justify-center gap-0.5 text-sm leading-5", children: [
58
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
59
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("min-w-0 flex-1 truncate", unread && "font-semibold"), children: participants }),
60
+ hasAttachments && /* @__PURE__ */ jsxRuntime.jsx(
61
+ lucideReact.Paperclip,
62
+ {
63
+ className: "size-3.5 shrink-0 text-muted-foreground",
64
+ "aria-label": "Has attachments"
65
+ }
66
+ ),
67
+ deliveryProblem2 && /* @__PURE__ */ jsxRuntime.jsx(MailDeliveryBadge, { problem: deliveryProblem2 }),
68
+ /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime, className: "shrink-0 text-xs font-normal text-muted-foreground", children: date })
69
+ ] }),
70
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: ui.cn("truncate", unread && "font-semibold"), children: subject || "(No subject)" }),
71
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "truncate font-normal text-muted-foreground", children: preview || "\xA0" })
72
+ ] });
73
+ }
74
+
75
+ // src/collaboration/mail/mailCompose.ts
76
+ var emptyMailCompose = () => ({
77
+ to: [],
78
+ cc: [],
79
+ bcc: [],
80
+ subject: "",
81
+ text: "",
82
+ attachments: []
83
+ });
84
+ var mailAddressLabel = (person) => person.name || person.email;
85
+ function parseMailRecipients(value) {
86
+ const addresses = (value.match(/(?:[^,;"\n]|"[^"]*")+/g) ?? []).map((entry) => entry.trim()).filter(Boolean).map((entry) => {
87
+ const named = entry.match(/^(.*?)\s*<([^<>]+)>$/);
88
+ return named ? { email: named[2].trim(), name: named[1].trim().replace(/^"|"$/g, "") } : { email: entry };
89
+ });
90
+ return addresses.filter(
91
+ (address, index) => addresses.findIndex((item) => item.email.toLowerCase() === address.email.toLowerCase()) === index
92
+ );
93
+ }
94
+ function replyMailCompose(message, {
95
+ account,
96
+ folderRole,
97
+ forward = false,
98
+ all = false,
99
+ attachments = []
100
+ }) {
101
+ return {
102
+ ...emptyMailCompose(),
103
+ to: forward ? [] : folderRole === "sent" ? message.to : message.sender,
104
+ cc: all ? [...message.to, ...message.cc].filter(
105
+ (r) => r.email.toLowerCase() !== account.email.toLowerCase() && !message.sender.some((s) => s.email.toLowerCase() === r.email.toLowerCase())
106
+ ).filter(
107
+ (r, i, values) => values.findIndex((v) => v.email.toLowerCase() === r.email.toLowerCase()) === i
108
+ ) : [],
109
+ subject: `${forward ? "Fwd" : "Re"}: ${message.subject.replace(/^(Re|Fwd):\s*/i, "")}`,
110
+ text: `
111
+
112
+ ${message.sender.map((s) => s.email).join(", ")} wrote:
113
+ ${message.text}`,
114
+ in_reply_to: forward ? void 0 : message.message_id,
115
+ references: [...message.references, ...message.message_id ? [message.message_id] : []],
116
+ attachments,
117
+ secure_delivery: message.secure_delivery
118
+ };
119
+ }
120
+ function draftMailCompose(message, attachments) {
121
+ return {
122
+ to: message.to,
123
+ cc: message.cc,
124
+ bcc: message.bcc,
125
+ subject: message.subject,
126
+ text: message.text,
127
+ html: message.html,
128
+ attachments,
129
+ draft_id: message.id,
130
+ secure_delivery: message.secure_delivery
131
+ };
132
+ }
133
+ var hasCalendarPart = (attachments) => attachments.some(
134
+ (a) => /^text\/calendar\b|^application\/ics\b/i.test(a.content_type) || /\.ics$/i.test(a.name)
135
+ );
136
+ function deliveryProblem(status) {
137
+ return status === "bounced" || status === "partially_bounced" || status === "delayed" ? status : void 0;
138
+ }
139
+ function MailGrid({
140
+ messages,
141
+ loading,
142
+ selected,
143
+ onSelect,
144
+ outgoing = false,
145
+ personLabel = mailAddressLabel,
146
+ gridState,
147
+ onGridStateChange
148
+ }) {
149
+ const columns = react.useMemo(
150
+ () => [
151
+ {
152
+ colId: "unread",
153
+ cellStyle: { padding: 0, justifyContent: "center" },
154
+ headerName: "",
155
+ width: 34,
156
+ minWidth: 34,
157
+ maxWidth: 34,
158
+ sortable: false,
159
+ resizable: false,
160
+ cellRenderer: ({ data }) => data?.unread ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block size-2 rounded-full bg-primary", "aria-label": "Unread" }) : null
161
+ },
162
+ {
163
+ colId: "message",
164
+ cellClass: "[&_.ag-cell-value]:h-full [&_.ag-cell-value]:w-full [&_.ag-cell-wrapper]:h-full [&_.ag-cell-wrapper]:w-full",
165
+ headerName: "Message",
166
+ flex: 1,
167
+ minWidth: 240,
168
+ sortable: false,
169
+ valueGetter: (p) => p.data?.subject ?? "",
170
+ cellRenderer: ({ data }) => data ? /* @__PURE__ */ jsxRuntime.jsx(
171
+ MailMessagePreview,
172
+ {
173
+ participants: (outgoing ? data.to : data.sender).map(personLabel).join(", "),
174
+ subject: data.subject,
175
+ preview: data.preview,
176
+ unread: data.unread,
177
+ hasAttachments: Boolean(data.attachments.length),
178
+ deliveryProblem: deliveryProblem(data.delivery_status),
179
+ dateTime: data.received_at,
180
+ date: data.received_at ? new Date(data.received_at).toLocaleString(void 0, {
181
+ month: "short",
182
+ day: "numeric",
183
+ hour: "2-digit",
184
+ minute: "2-digit"
185
+ }) : ""
186
+ }
187
+ ) : null
188
+ }
189
+ ],
190
+ [outgoing, personLabel]
191
+ );
192
+ return /* @__PURE__ */ jsxRuntime.jsx(
193
+ chunkIXALYQT7_cjs.GridView,
194
+ {
195
+ items: messages,
196
+ columnDefs: columns,
197
+ getItemId: (m) => m.id,
198
+ onRowClick: (m) => onSelect(m.id),
199
+ height: "100%",
200
+ rowHeight: 84,
201
+ persistState: Boolean(onGridStateChange),
202
+ gridId: "personal-mail-grid-v2",
203
+ gridState,
204
+ onGridStateChange,
205
+ testId: "mail-grid",
206
+ isLoading: loading,
207
+ getRowTestId: (m) => `mail-row-${m.id}`,
208
+ emptyState: {
209
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mail, { className: "size-10 text-muted-foreground/50" }),
210
+ title: "No messages",
211
+ message: "Messages in this folder will appear here."
212
+ },
213
+ gridOptions: {
214
+ headerHeight: 0,
215
+ suppressCellFocus: false,
216
+ onCellKeyDown: (event) => {
217
+ if (event.event?.key === "Enter" && event.data) onSelect(event.data.id);
218
+ },
219
+ defaultColDef: {
220
+ sortable: true,
221
+ resizable: true,
222
+ filter: false
223
+ },
224
+ rowClassRules: { "bg-muted/60": (p) => p.data?.id === selected }
225
+ }
226
+ }
227
+ );
228
+ }
229
+ var ICONS = {
230
+ accepted: lucideReact.Send,
231
+ relayed: lucideReact.Send,
232
+ expanded: lucideReact.Send,
233
+ delivered: lucideReact.CheckCircle2,
234
+ delayed: lucideReact.Clock,
235
+ rejected: lucideReact.AlertCircle,
236
+ failed: lucideReact.AlertCircle
237
+ };
238
+ var LABELS = {
239
+ accepted: "Sent",
240
+ relayed: "Sent",
241
+ expanded: "Sent",
242
+ delivered: "Delivered",
243
+ delayed: "Delayed",
244
+ rejected: "Not delivered",
245
+ failed: "Not delivered"
246
+ };
247
+ function MailDeliveryList({
248
+ recipients
249
+ }) {
250
+ if (recipients.length === 0) return null;
251
+ return /* @__PURE__ */ jsxRuntime.jsxs(
252
+ "section",
253
+ {
254
+ "aria-label": "Delivery",
255
+ className: "mb-5 rounded-md border border-border/60 px-3 py-2",
256
+ "data-testid": "mail-delivery-list",
257
+ children: [
258
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-1 text-xs font-medium text-muted-foreground", children: "Delivery" }),
259
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-1", children: recipients.map((recipient) => {
260
+ const Icon = ICONS[recipient.status];
261
+ const failed = recipient.status === "failed" || recipient.status === "rejected";
262
+ return /* @__PURE__ */ jsxRuntime.jsxs(
263
+ "li",
264
+ {
265
+ className: "flex flex-wrap items-baseline gap-x-2 text-sm",
266
+ "data-testid": `mail-delivery-${recipient.email}`,
267
+ children: [
268
+ /* @__PURE__ */ jsxRuntime.jsx(
269
+ Icon,
270
+ {
271
+ "aria-hidden": "true",
272
+ className: ui.cn(
273
+ "size-3.5 shrink-0 self-center",
274
+ failed ? "text-destructive" : "text-muted-foreground"
275
+ )
276
+ }
277
+ ),
278
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: recipient.email }),
279
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: ui.cn(failed ? "text-destructive" : "text-muted-foreground"), children: [
280
+ LABELS[recipient.status],
281
+ ": ",
282
+ recipient.description
283
+ ] })
284
+ ]
285
+ },
286
+ recipient.email
287
+ );
288
+ }) })
289
+ ]
290
+ }
291
+ );
292
+ }
293
+ var NEEDS_CONNECTION = "Available when you are back online";
294
+ var SANITIZE = {
295
+ ALLOWED_TAGS: [
296
+ "p",
297
+ "br",
298
+ "strong",
299
+ "b",
300
+ "em",
301
+ "i",
302
+ "u",
303
+ "s",
304
+ "ul",
305
+ "ol",
306
+ "li",
307
+ "a",
308
+ "span",
309
+ "blockquote"
310
+ ],
311
+ ALLOWED_ATTR: ["href"],
312
+ ALLOW_DATA_ATTR: false
313
+ };
314
+ function MailMessageView({
315
+ account,
316
+ message,
317
+ folderRole,
318
+ folders,
319
+ isOnline,
320
+ loading,
321
+ uploadPending,
322
+ onBack,
323
+ onEditDraft,
324
+ onReply,
325
+ onUpdate,
326
+ onDownloadAttachment,
327
+ onDownloadOriginal,
328
+ onSaveToWorkspace,
329
+ personLabel = mailAddressLabel,
330
+ renderInvite
331
+ }) {
332
+ const offlineTitle = isOnline ? void 0 : NEEDS_CONNECTION;
333
+ return /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "min-w-0 flex-1 overflow-auto p-4 sm:p-5", children: [
334
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { className: "mb-3", variant: "ghost", onClick: onBack, children: [
335
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeft, { className: "mr-2 size-4" }),
336
+ "Back"
337
+ ] }),
338
+ loading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "Loading message\u2026" }),
339
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "-mx-4 mb-5 flex flex-wrap items-center gap-1 border-b bg-muted/20 px-3 py-1.5 sm:-mx-5 [&_button]:h-8 [&_button]:px-2 [&_button]:text-xs", children: [
340
+ folderRole === "drafts" ? /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { onClick: onEditDraft, children: "Edit draft" }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
341
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "ghost", onClick: () => onReply(), children: [
342
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Reply, { className: "mr-2 size-4" }),
343
+ "Reply"
344
+ ] }),
345
+ message.to.length + message.cc.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "ghost", onClick: () => onReply(false, true), children: "Reply all" }),
346
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { variant: "ghost", onClick: () => onReply(true), children: [
347
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Forward, { className: "mr-2 size-4" }),
348
+ "Forward"
349
+ ] })
350
+ ] }),
351
+ /* @__PURE__ */ jsxRuntime.jsx(
352
+ ui.Button,
353
+ {
354
+ variant: "ghost",
355
+ disabled: !isOnline,
356
+ title: offlineTitle,
357
+ onClick: () => onUpdate({ unread: !message.unread }),
358
+ children: message.unread ? "Mark read" : "Mark unread"
359
+ }
360
+ ),
361
+ (folderRole === "archive" || folderRole === "trash") && /* @__PURE__ */ jsxRuntime.jsx(
362
+ ui.Button,
363
+ {
364
+ variant: "ghost",
365
+ disabled: !isOnline,
366
+ title: offlineTitle,
367
+ onClick: () => onUpdate({ folder_id: folders?.find((f) => f.role === "inbox")?.id ?? "inbox" }),
368
+ children: "Move to Inbox"
369
+ }
370
+ ),
371
+ /* @__PURE__ */ jsxRuntime.jsx(
372
+ ui.Button,
373
+ {
374
+ variant: "ghost",
375
+ "aria-label": "Archive message",
376
+ disabled: !isOnline,
377
+ title: offlineTitle,
378
+ onClick: () => onUpdate({ folder_id: folders?.find((f) => f.role === "archive")?.id ?? "archive" }),
379
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Archive, { className: "size-4" })
380
+ }
381
+ ),
382
+ /* @__PURE__ */ jsxRuntime.jsx(
383
+ ui.Button,
384
+ {
385
+ variant: "ghost",
386
+ "aria-label": "Trash message",
387
+ disabled: !isOnline,
388
+ title: offlineTitle,
389
+ onClick: () => onUpdate({ action: "trash" }),
390
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, { className: "size-4" })
391
+ }
392
+ )
393
+ ] }),
394
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4 flex flex-wrap items-center gap-2", children: [
395
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-semibold leading-snug tracking-tight", children: message.subject || "(No subject)" }),
396
+ (message.delivery_status === "bounced" || message.delivery_status === "partially_bounced" || message.delivery_status === "delayed") && /* @__PURE__ */ jsxRuntime.jsx(MailDeliveryBadge, { problem: message.delivery_status })
397
+ ] }),
398
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-5 flex gap-3 border-b border-border/60 pb-4", children: [
399
+ /* @__PURE__ */ jsxRuntime.jsx(
400
+ "span",
401
+ {
402
+ "aria-hidden": "true",
403
+ className: "flex size-10 shrink-0 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary",
404
+ children: (message.sender[0]?.name || message.sender[0]?.email || "?").split(/\s+/).slice(0, 2).map((part) => part[0]).join("").toUpperCase()
405
+ }
406
+ ),
407
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
408
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-baseline justify-between gap-1", children: [
409
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold", children: message.sender.map((person) => person.name || person.email).join(", ") }),
410
+ /* @__PURE__ */ jsxRuntime.jsx("time", { className: "text-[11px] text-muted-foreground", children: message.received_at ? new Date(message.received_at).toLocaleString() : "" })
411
+ ] }),
412
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "break-all text-xs text-muted-foreground", children: message.sender.map((person) => person.email).join(", ") }),
413
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-2 break-all text-xs text-muted-foreground", children: [
414
+ "To: ",
415
+ message.to.map(personLabel).join(", "),
416
+ message.cc.length > 0 && ` \xB7 Cc: ${message.cc.map(personLabel).join(", ")}`
417
+ ] })
418
+ ] })
419
+ ] }),
420
+ /* @__PURE__ */ jsxRuntime.jsx(MailDeliveryList, { recipients: message.delivery ?? [] }),
421
+ renderInvite && hasCalendarPart(message.attachments) && renderInvite(),
422
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 flex flex-wrap gap-2", children: message.attachments.map((a) => /* @__PURE__ */ jsxRuntime.jsxs(
423
+ ui.Button,
424
+ {
425
+ className: "h-auto min-h-12 justify-start rounded-md border-border/70 bg-muted/20 px-3 py-2 text-left shadow-none hover:bg-muted/60",
426
+ variant: "outline",
427
+ onClick: () => onDownloadAttachment(a),
428
+ children: [
429
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "mr-2 size-4" }),
430
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0", children: [
431
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block truncate text-xs font-medium", children: a.name }),
432
+ /* @__PURE__ */ jsxRuntime.jsx(
433
+ "span",
434
+ {
435
+ "aria-hidden": "true",
436
+ className: "block text-[11px] font-normal text-muted-foreground",
437
+ children: a.size < 1024 ? `${a.size} B` : `${Math.ceil(a.size / 1024)} KB`
438
+ }
439
+ )
440
+ ] })
441
+ ]
442
+ },
443
+ a.id
444
+ )) }),
445
+ message.html && message.text ? /* @__PURE__ */ jsxRuntime.jsx(
446
+ "div",
447
+ {
448
+ className: "text-sm leading-7 [&_p]:mb-3 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:list-decimal [&_ol]:pl-6 [&_a]:text-primary [&_a]:underline",
449
+ dangerouslySetInnerHTML: { __html: DOMPurify__default.default.sanitize(message.html, SANITIZE) }
450
+ }
451
+ ) : message.text ? /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "whitespace-pre-wrap break-words font-sans text-sm leading-7 text-foreground/90", children: message.text.split(/(https?:\/\/[^\s]+)/g).map(
452
+ (part, index) => /^https?:\/\//.test(part) ? /* @__PURE__ */ jsxRuntime.jsx(
453
+ "a",
454
+ {
455
+ href: part,
456
+ className: "text-primary underline underline-offset-2",
457
+ rel: "noreferrer",
458
+ children: part
459
+ },
460
+ index
461
+ ) : part
462
+ ) }) : message.html ? /* @__PURE__ */ jsxRuntime.jsx(
463
+ "iframe",
464
+ {
465
+ title: "Email body",
466
+ sandbox: "",
467
+ referrerPolicy: "no-referrer",
468
+ className: "min-h-96 w-full border-0 bg-white",
469
+ srcDoc: `<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'">${message.html}`
470
+ }
471
+ ) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "Empty message" }),
472
+ account.provider === "native" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2", children: [
473
+ /* @__PURE__ */ jsxRuntime.jsx(
474
+ ui.Button,
475
+ {
476
+ className: "mt-5",
477
+ variant: "outline",
478
+ disabled: !isOnline,
479
+ title: offlineTitle,
480
+ onClick: onDownloadOriginal,
481
+ children: "Download original email"
482
+ }
483
+ ),
484
+ onSaveToWorkspace && /* @__PURE__ */ jsxRuntime.jsx(
485
+ ui.Button,
486
+ {
487
+ className: "mt-5",
488
+ variant: "outline",
489
+ disabled: uploadPending || !isOnline,
490
+ title: offlineTitle,
491
+ onClick: onSaveToWorkspace,
492
+ children: "Save to workspace"
493
+ }
494
+ )
495
+ ] })
496
+ ] });
497
+ }
498
+ function MailDocumentPicker({
499
+ documents,
500
+ onAttach,
501
+ disabled = false
502
+ }) {
503
+ const [open, setOpen] = react.useState(false);
504
+ const [query, setQuery] = react.useState("");
505
+ const filtered = react.useMemo(() => {
506
+ const q = query.trim().toLowerCase();
507
+ return q ? documents.filter((d) => d.title.toLowerCase().includes(q)) : documents;
508
+ }, [documents, query]);
509
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open, onOpenChange: setOpen, children: [
510
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
511
+ ui.Button,
512
+ {
513
+ type: "button",
514
+ variant: "ghost",
515
+ disabled,
516
+ "data-testid": "mail-attach-workspace-document",
517
+ children: [
518
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderOpen, { className: "mr-2 size-4" }),
519
+ "From workspace"
520
+ ]
521
+ }
522
+ ) }),
523
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverContent, { className: "w-80 p-0", align: "start", sideOffset: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Command, { shouldFilter: false, children: [
524
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandInput, { placeholder: "Search documents...", value: query, onValueChange: setQuery }),
525
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.CommandList, { className: "max-h-72", children: [
526
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandEmpty, { children: "No documents in this workspace" }),
527
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: filtered.map((doc) => /* @__PURE__ */ jsxRuntime.jsxs(
528
+ ui.CommandItem,
529
+ {
530
+ value: doc.id,
531
+ onSelect: () => {
532
+ setOpen(false);
533
+ setQuery("");
534
+ onAttach(doc);
535
+ },
536
+ "data-testid": `document-search-item-${doc.id}`,
537
+ children: [
538
+ doc.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-muted-foreground", children: doc.icon }),
539
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1.5 flex-1 truncate text-sm", children: doc.title })
540
+ ]
541
+ },
542
+ doc.id
543
+ )) })
544
+ ] })
545
+ ] }) })
546
+ ] });
547
+ }
548
+ function PlainMailBodyEditor({ text, disabled, onChange }) {
549
+ return /* @__PURE__ */ jsxRuntime.jsx(
550
+ "textarea",
551
+ {
552
+ "aria-label": "Message",
553
+ className: "my-3 min-h-48 w-full resize-y bg-transparent text-sm outline-none",
554
+ value: text,
555
+ disabled,
556
+ onChange: (event) => onChange(event.target.value, "")
557
+ }
558
+ );
559
+ }
560
+
561
+ exports.MailDeliveryBadge = MailDeliveryBadge;
562
+ exports.MailDeliveryList = MailDeliveryList;
563
+ exports.MailDocumentPicker = MailDocumentPicker;
564
+ exports.MailGrid = MailGrid;
565
+ exports.MailMessagePreview = MailMessagePreview;
566
+ exports.MailMessageView = MailMessageView;
567
+ exports.NEEDS_CONNECTION = NEEDS_CONNECTION;
568
+ exports.PlainMailBodyEditor = PlainMailBodyEditor;
569
+ exports.draftMailCompose = draftMailCompose;
570
+ exports.emptyMailCompose = emptyMailCompose;
571
+ exports.hasCalendarPart = hasCalendarPart;
572
+ exports.mailAddressLabel = mailAddressLabel;
573
+ exports.parseMailRecipients = parseMailRecipients;
574
+ exports.replyMailCompose = replyMailCompose;
575
+ //# sourceMappingURL=chunk-3R6XBYL7.cjs.map
576
+ //# sourceMappingURL=chunk-3R6XBYL7.cjs.map