@mailoo/chat 0.0.0-stage → 1.33.0

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 (58) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +152 -2
  3. package/dist/chat-message-Dw6tKBEb.d.cts +10 -0
  4. package/dist/chat-message-Dw6tKBEb.d.ts +10 -0
  5. package/dist/chunk-2Y37RYEL.js +141 -0
  6. package/dist/chunk-2Y37RYEL.js.map +1 -0
  7. package/dist/chunk-4TNHJERE.js +19 -0
  8. package/dist/chunk-4TNHJERE.js.map +1 -0
  9. package/dist/chunk-77E6HUHY.js +41 -0
  10. package/dist/chunk-77E6HUHY.js.map +1 -0
  11. package/dist/chunk-AU6EFFLV.js +431 -0
  12. package/dist/chunk-AU6EFFLV.js.map +1 -0
  13. package/dist/chunk-QZ7HWQDO.js +839 -0
  14. package/dist/chunk-QZ7HWQDO.js.map +1 -0
  15. package/dist/client/index.cjs +1658 -0
  16. package/dist/client/index.cjs.map +1 -0
  17. package/dist/client/index.d.cts +33 -0
  18. package/dist/client/index.d.ts +33 -0
  19. package/dist/client/index.js +597 -0
  20. package/dist/client/index.js.map +1 -0
  21. package/dist/hooks/index.cjs +751 -0
  22. package/dist/hooks/index.cjs.map +1 -0
  23. package/dist/hooks/index.d.cts +79 -0
  24. package/dist/hooks/index.d.ts +79 -0
  25. package/dist/hooks/index.js +32 -0
  26. package/dist/hooks/index.js.map +1 -0
  27. package/dist/index.cjs +213 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.cts +53 -0
  30. package/dist/index.d.ts +53 -0
  31. package/dist/index.js +27 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/mailoo-site-chat-widget-C7B797Lu.d.ts +130 -0
  34. package/dist/mailoo-site-chat-widget-h_cBqsJw.d.cts +130 -0
  35. package/dist/routes/index.cjs +204 -0
  36. package/dist/routes/index.cjs.map +1 -0
  37. package/dist/routes/index.d.cts +30 -0
  38. package/dist/routes/index.d.ts +30 -0
  39. package/dist/routes/index.js +174 -0
  40. package/dist/routes/index.js.map +1 -0
  41. package/dist/shared-glVmghqk.d.cts +40 -0
  42. package/dist/shared-glVmghqk.d.ts +40 -0
  43. package/dist/styles/widget.css +122 -0
  44. package/dist/welcome-presets/index.cjs +479 -0
  45. package/dist/welcome-presets/index.cjs.map +1 -0
  46. package/dist/welcome-presets/index.d.cts +53 -0
  47. package/dist/welcome-presets/index.d.ts +53 -0
  48. package/dist/welcome-presets/index.js +38 -0
  49. package/dist/welcome-presets/index.js.map +1 -0
  50. package/dist/welcome-presets/parse.cjs +44 -0
  51. package/dist/welcome-presets/parse.cjs.map +1 -0
  52. package/dist/welcome-presets/parse.d.cts +11 -0
  53. package/dist/welcome-presets/parse.d.ts +11 -0
  54. package/dist/welcome-presets/parse.js +9 -0
  55. package/dist/welcome-presets/parse.js.map +1 -0
  56. package/dist/widget-config-B5Tf7gqn.d.cts +32 -0
  57. package/dist/widget-config-B5Tf7gqn.d.ts +32 -0
  58. package/package.json +85 -3
@@ -0,0 +1,174 @@
1
+ import {
2
+ getMailooChatIntegrationConfig
3
+ } from "../chunk-2Y37RYEL.js";
4
+ import "../chunk-77E6HUHY.js";
5
+
6
+ // src/routes/index.ts
7
+ import {
8
+ defaultMailooLogger,
9
+ jsonError,
10
+ mailooUpstreamOrigin,
11
+ proxyMailooWebhookJsonPost
12
+ } from "@mailoo/next-core";
13
+ function upstreamGetHeaders(request, apiKey) {
14
+ const headers = {
15
+ "Content-Type": "application/json",
16
+ "X-API-Key": apiKey
17
+ };
18
+ const origin = mailooUpstreamOrigin(request);
19
+ if (origin) headers.Origin = origin;
20
+ return headers;
21
+ }
22
+ function createChatSubmitHandler(options) {
23
+ const logger = options?.logger ?? defaultMailooLogger;
24
+ return async function POST(request) {
25
+ const cfg = getMailooChatIntegrationConfig();
26
+ if (!cfg) {
27
+ return jsonError(
28
+ {
29
+ error: "NOT_CONFIGURED",
30
+ message: "Chat BFF is not configured. Set MAILOO_CHAT_INTEGRATION_* env."
31
+ },
32
+ 503
33
+ );
34
+ }
35
+ let body;
36
+ try {
37
+ body = await request.json();
38
+ } catch {
39
+ return jsonError({ error: "Invalid JSON body" }, 400);
40
+ }
41
+ const o = body && typeof body === "object" && !Array.isArray(body) ? body : {};
42
+ const content = typeof o.content === "string" ? o.content.trim() : "";
43
+ if (!content) {
44
+ return jsonError({ error: "content is required" }, 400);
45
+ }
46
+ const payload = { content };
47
+ if (typeof o.sessionPublicId === "string" && o.sessionPublicId.trim()) {
48
+ payload.sessionPublicId = o.sessionPublicId.trim();
49
+ }
50
+ const fromSession = options?.resolveSender ? await options.resolveSender(request) : null;
51
+ if (fromSession?.email) {
52
+ payload.senderEmail = fromSession.email;
53
+ const name = fromSession.name?.trim();
54
+ if (name) payload.senderName = name;
55
+ } else {
56
+ if (typeof o.senderEmail === "string" && o.senderEmail.trim()) {
57
+ payload.senderEmail = o.senderEmail.trim();
58
+ }
59
+ if (typeof o.senderName === "string" && o.senderName.trim()) {
60
+ payload.senderName = o.senderName.trim();
61
+ }
62
+ }
63
+ if (typeof o.pageUrl === "string" && o.pageUrl.trim()) {
64
+ const pageUrl = o.pageUrl.trim();
65
+ if (pageUrl.length <= 2048 && !/[\r\n\0]/.test(pageUrl)) {
66
+ payload.pageUrl = pageUrl;
67
+ }
68
+ }
69
+ if (typeof o.topicId === "string" && o.topicId.trim()) {
70
+ payload.topicId = o.topicId.trim();
71
+ }
72
+ const url = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/messages`;
73
+ try {
74
+ return await proxyMailooWebhookJsonPost({
75
+ request,
76
+ url,
77
+ apiKey: cfg.apiKey,
78
+ body: payload
79
+ });
80
+ } catch (error) {
81
+ logger.logException?.(error, "chat submit proxy failed");
82
+ return jsonError({ error: "Upstream request failed" }, 502);
83
+ }
84
+ };
85
+ }
86
+ function createChatMessagesHandler(options) {
87
+ const logger = options?.logger ?? defaultMailooLogger;
88
+ return async function GET(request) {
89
+ const cfg = getMailooChatIntegrationConfig();
90
+ if (!cfg) {
91
+ return jsonError({ error: "Chat BFF not configured" }, 503);
92
+ }
93
+ const sessionPublicId = request.nextUrl.searchParams.get("sessionPublicId")?.trim();
94
+ if (!sessionPublicId) {
95
+ return jsonError({ error: "sessionPublicId is required" }, 400);
96
+ }
97
+ const since = request.nextUrl.searchParams.get("since")?.trim();
98
+ const path = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/sessions/${encodeURIComponent(sessionPublicId)}/messages`;
99
+ const url = new URL(path);
100
+ if (since) url.searchParams.set("since", since);
101
+ try {
102
+ const response = await fetch(url.toString(), {
103
+ method: "GET",
104
+ headers: upstreamGetHeaders(request, cfg.apiKey)
105
+ });
106
+ const data = await response.json();
107
+ return new Response(JSON.stringify(data), {
108
+ status: response.status,
109
+ headers: { "Content-Type": "application/json" }
110
+ });
111
+ } catch (error) {
112
+ logger.logException?.(error, "chat messages proxy failed");
113
+ return jsonError({ error: "Upstream request failed" }, 502);
114
+ }
115
+ };
116
+ }
117
+ function createChatStatusHandler(options) {
118
+ const logger = options?.logger ?? defaultMailooLogger;
119
+ return async function GET(request) {
120
+ const cfg = getMailooChatIntegrationConfig();
121
+ if (!cfg) {
122
+ return jsonError({ error: "Chat BFF not configured" }, 503);
123
+ }
124
+ const url = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/status`;
125
+ try {
126
+ const response = await fetch(url, {
127
+ method: "GET",
128
+ headers: upstreamGetHeaders(request, cfg.apiKey)
129
+ });
130
+ const data = await response.json();
131
+ return new Response(JSON.stringify(data), {
132
+ status: response.status,
133
+ headers: { "Content-Type": "application/json" }
134
+ });
135
+ } catch (error) {
136
+ logger.logException?.(error, "chat status proxy failed");
137
+ return jsonError({ error: "Upstream request failed" }, 502);
138
+ }
139
+ };
140
+ }
141
+ function createChatWidgetConfigHandler(options) {
142
+ const logger = options?.logger ?? defaultMailooLogger;
143
+ return async function GET(request) {
144
+ const cfg = getMailooChatIntegrationConfig();
145
+ if (!cfg) {
146
+ return jsonError({ error: "Chat BFF not configured" }, 503);
147
+ }
148
+ const locale = request.nextUrl.searchParams.get("locale")?.trim() || "en";
149
+ const path = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/widget-config`;
150
+ const url = new URL(path);
151
+ url.searchParams.set("locale", locale);
152
+ try {
153
+ const response = await fetch(url.toString(), {
154
+ method: "GET",
155
+ headers: upstreamGetHeaders(request, cfg.apiKey)
156
+ });
157
+ const data = await response.json();
158
+ return new Response(JSON.stringify(data), {
159
+ status: response.status,
160
+ headers: { "Content-Type": "application/json" }
161
+ });
162
+ } catch (error) {
163
+ logger.logException?.(error, "chat widget-config proxy failed");
164
+ return jsonError({ error: "Upstream request failed" }, 502);
165
+ }
166
+ };
167
+ }
168
+ export {
169
+ createChatMessagesHandler,
170
+ createChatStatusHandler,
171
+ createChatSubmitHandler,
172
+ createChatWidgetConfigHandler
173
+ };
174
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/routes/index.ts"],"sourcesContent":["import type { NextRequest } from 'next/server'\nimport {\n defaultMailooLogger,\n jsonError,\n mailooUpstreamOrigin,\n proxyMailooWebhookJsonPost,\n type MailooLogger,\n} from '@mailoo/next-core'\nimport { getMailooChatIntegrationConfig } from '../config.js'\n\nexport type ChatSubmitSender = {\n email?: string\n name?: string\n}\n\nfunction upstreamGetHeaders(\n request: NextRequest,\n apiKey: string\n): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-API-Key': apiKey,\n }\n const origin = mailooUpstreamOrigin(request)\n if (origin) headers.Origin = origin\n return headers\n}\n\n/**\n * Create chat message submit handler.\n * Optional `resolveSender` lets hosts inject Auth.js/session email without\n * coupling this package to Auth.js.\n */\nexport function createChatSubmitHandler(options?: {\n logger?: MailooLogger\n resolveSender?: (\n request: NextRequest\n ) => Promise<ChatSubmitSender | null> | ChatSubmitSender | null\n}) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function POST(request: NextRequest): Promise<Response> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) {\n return jsonError(\n {\n error: 'NOT_CONFIGURED',\n message:\n 'Chat BFF is not configured. Set MAILOO_CHAT_INTEGRATION_* env.',\n },\n 503\n )\n }\n\n let body: unknown\n try {\n body = await request.json()\n } catch {\n return jsonError({ error: 'Invalid JSON body' }, 400)\n }\n\n const o =\n body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {}\n\n const content = typeof o.content === 'string' ? o.content.trim() : ''\n if (!content) {\n return jsonError({ error: 'content is required' }, 400)\n }\n\n const payload: Record<string, string> = { content }\n\n if (typeof o.sessionPublicId === 'string' && o.sessionPublicId.trim()) {\n payload.sessionPublicId = o.sessionPublicId.trim()\n }\n\n const fromSession = options?.resolveSender\n ? await options.resolveSender(request)\n : null\n\n if (fromSession?.email) {\n payload.senderEmail = fromSession.email\n const name = fromSession.name?.trim()\n if (name) payload.senderName = name\n } else {\n if (typeof o.senderEmail === 'string' && o.senderEmail.trim()) {\n payload.senderEmail = o.senderEmail.trim()\n }\n if (typeof o.senderName === 'string' && o.senderName.trim()) {\n payload.senderName = o.senderName.trim()\n }\n }\n\n if (typeof o.pageUrl === 'string' && o.pageUrl.trim()) {\n const pageUrl = o.pageUrl.trim()\n if (pageUrl.length <= 2048 && !/[\\r\\n\\0]/.test(pageUrl)) {\n payload.pageUrl = pageUrl\n }\n }\n\n if (typeof o.topicId === 'string' && o.topicId.trim()) {\n payload.topicId = o.topicId.trim()\n }\n\n const url = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/messages`\n\n try {\n return await proxyMailooWebhookJsonPost({\n request,\n url,\n apiKey: cfg.apiKey,\n body: payload,\n })\n } catch (error) {\n logger.logException?.(error, 'chat submit proxy failed')\n return jsonError({ error: 'Upstream request failed' }, 502)\n }\n }\n}\n\n/** Visitor polling: list session messages via server-held API key. */\nexport function createChatMessagesHandler(options?: { logger?: MailooLogger }) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(request: NextRequest): Promise<Response> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) {\n return jsonError({ error: 'Chat BFF not configured' }, 503)\n }\n\n const sessionPublicId = request.nextUrl.searchParams\n .get('sessionPublicId')\n ?.trim()\n if (!sessionPublicId) {\n return jsonError({ error: 'sessionPublicId is required' }, 400)\n }\n\n const since = request.nextUrl.searchParams.get('since')?.trim()\n const path = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/sessions/${encodeURIComponent(sessionPublicId)}/messages`\n const url = new URL(path)\n if (since) url.searchParams.set('since', since)\n\n try {\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: upstreamGetHeaders(request, cfg.apiKey),\n })\n const data = await response.json()\n return new Response(JSON.stringify(data), {\n status: response.status,\n headers: { 'Content-Type': 'application/json' },\n })\n } catch (error) {\n logger.logException?.(error, 'chat messages proxy failed')\n return jsonError({ error: 'Upstream request failed' }, 502)\n }\n }\n}\n\n/** Chat integration status via server-held API key. */\nexport function createChatStatusHandler(options?: { logger?: MailooLogger }) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(request: NextRequest): Promise<Response> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) {\n return jsonError({ error: 'Chat BFF not configured' }, 503)\n }\n\n const url = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/status`\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: upstreamGetHeaders(request, cfg.apiKey),\n })\n const data = await response.json()\n return new Response(JSON.stringify(data), {\n status: response.status,\n headers: { 'Content-Type': 'application/json' },\n })\n } catch (error) {\n logger.logException?.(error, 'chat status proxy failed')\n return jsonError({ error: 'Upstream request failed' }, 502)\n }\n }\n}\n\n/** Public widget config (brand, operators, topics, privacy URL). */\nexport function createChatWidgetConfigHandler(options?: {\n logger?: MailooLogger\n}) {\n const logger = options?.logger ?? defaultMailooLogger\n return async function GET(request: NextRequest): Promise<Response> {\n const cfg = getMailooChatIntegrationConfig()\n if (!cfg) {\n return jsonError({ error: 'Chat BFF not configured' }, 503)\n }\n\n const locale = request.nextUrl.searchParams.get('locale')?.trim() || 'en'\n const path = `${cfg.apiBaseUrl}/api/v1/webhooks/chat/${cfg.projectUid}/${cfg.integrationId}/widget-config`\n const url = new URL(path)\n url.searchParams.set('locale', locale)\n\n try {\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: upstreamGetHeaders(request, cfg.apiKey),\n })\n const data = await response.json()\n return new Response(JSON.stringify(data), {\n status: response.status,\n headers: { 'Content-Type': 'application/json' },\n })\n } catch (error) {\n logger.logException?.(error, 'chat widget-config proxy failed')\n return jsonError({ error: 'Upstream request failed' }, 502)\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,40 @@
1
+ declare const DEFAULT_CHAT_SUBMIT_ENDPOINT = "/api/v1/webhooks/chat/submit";
2
+ declare const DEFAULT_CHAT_MESSAGES_ENDPOINT = "/api/v1/webhooks/chat/messages";
3
+ declare const DEFAULT_CHAT_STATUS_ENDPOINT = "/api/v1/webhooks/chat/status";
4
+ declare const DEFAULT_CHAT_SESSION_STORAGE_KEY = "mailoo_site_chat_session_public_id";
5
+ declare const DEFAULT_CHAT_GUEST_PROFILE_KEY = "mailoo_site_chat_guest_profile";
6
+ declare const DEFAULT_CHAT_POLL_INTERVAL_MS = 5000;
7
+ type MailooChatConnectionState = 'idle' | 'connecting' | 'open' | 'closed';
8
+ type MailooChatFaultKind = 'rate_limited' | 'unavailable';
9
+ /** Classified chat transport/service fault (not validation or session lifecycle). */
10
+ type MailooChatFault = {
11
+ kind: MailooChatFaultKind;
12
+ status: number;
13
+ message: string;
14
+ };
15
+ type MailooChatSubmitResult = {
16
+ ok: true;
17
+ status: number;
18
+ data: unknown;
19
+ } | {
20
+ ok: false;
21
+ status: number;
22
+ message: string;
23
+ };
24
+ type MailooChatStatus = {
25
+ status: string;
26
+ name: string;
27
+ type: string;
28
+ lastActivity: string;
29
+ };
30
+ declare function messageFromPayload(data: unknown, fallback: string): string;
31
+ /**
32
+ * Classify HTTP/network failures that should show the unavailable panel.
33
+ * Status-based only (no English string parsing). Returns null for validation,
34
+ * 4xx client errors other than 429, and session-not-found (handled separately).
35
+ */
36
+ declare function classifyChatFault(status: number, payload: unknown, fallbackMessage?: string): MailooChatFault | null;
37
+ /** Upstream 404 after DB reset / expired sessionStorage id. */
38
+ declare function isChatSessionNotFound(status: number, data: unknown): boolean;
39
+
40
+ export { DEFAULT_CHAT_GUEST_PROFILE_KEY as D, type MailooChatFault as M, type MailooChatConnectionState as a, type MailooChatSubmitResult as b, type MailooChatStatus as c, classifyChatFault as d, DEFAULT_CHAT_MESSAGES_ENDPOINT as e, DEFAULT_CHAT_POLL_INTERVAL_MS as f, DEFAULT_CHAT_SESSION_STORAGE_KEY as g, DEFAULT_CHAT_STATUS_ENDPOINT as h, DEFAULT_CHAT_SUBMIT_ENDPOINT as i, isChatSessionNotFound as j, type MailooChatFaultKind as k, messageFromPayload as m };
@@ -0,0 +1,40 @@
1
+ declare const DEFAULT_CHAT_SUBMIT_ENDPOINT = "/api/v1/webhooks/chat/submit";
2
+ declare const DEFAULT_CHAT_MESSAGES_ENDPOINT = "/api/v1/webhooks/chat/messages";
3
+ declare const DEFAULT_CHAT_STATUS_ENDPOINT = "/api/v1/webhooks/chat/status";
4
+ declare const DEFAULT_CHAT_SESSION_STORAGE_KEY = "mailoo_site_chat_session_public_id";
5
+ declare const DEFAULT_CHAT_GUEST_PROFILE_KEY = "mailoo_site_chat_guest_profile";
6
+ declare const DEFAULT_CHAT_POLL_INTERVAL_MS = 5000;
7
+ type MailooChatConnectionState = 'idle' | 'connecting' | 'open' | 'closed';
8
+ type MailooChatFaultKind = 'rate_limited' | 'unavailable';
9
+ /** Classified chat transport/service fault (not validation or session lifecycle). */
10
+ type MailooChatFault = {
11
+ kind: MailooChatFaultKind;
12
+ status: number;
13
+ message: string;
14
+ };
15
+ type MailooChatSubmitResult = {
16
+ ok: true;
17
+ status: number;
18
+ data: unknown;
19
+ } | {
20
+ ok: false;
21
+ status: number;
22
+ message: string;
23
+ };
24
+ type MailooChatStatus = {
25
+ status: string;
26
+ name: string;
27
+ type: string;
28
+ lastActivity: string;
29
+ };
30
+ declare function messageFromPayload(data: unknown, fallback: string): string;
31
+ /**
32
+ * Classify HTTP/network failures that should show the unavailable panel.
33
+ * Status-based only (no English string parsing). Returns null for validation,
34
+ * 4xx client errors other than 429, and session-not-found (handled separately).
35
+ */
36
+ declare function classifyChatFault(status: number, payload: unknown, fallbackMessage?: string): MailooChatFault | null;
37
+ /** Upstream 404 after DB reset / expired sessionStorage id. */
38
+ declare function isChatSessionNotFound(status: number, data: unknown): boolean;
39
+
40
+ export { DEFAULT_CHAT_GUEST_PROFILE_KEY as D, type MailooChatFault as M, type MailooChatConnectionState as a, type MailooChatSubmitResult as b, type MailooChatStatus as c, classifyChatFault as d, DEFAULT_CHAT_MESSAGES_ENDPOINT as e, DEFAULT_CHAT_POLL_INTERVAL_MS as f, DEFAULT_CHAT_SESSION_STORAGE_KEY as g, DEFAULT_CHAT_STATUS_ENDPOINT as h, DEFAULT_CHAT_SUBMIT_ENDPOINT as i, isChatSessionNotFound as j, type MailooChatFaultKind as k, messageFromPayload as m };
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Host-independent shell for MailooSiteChatWidget.
3
+ * Import via `@mailoo/chat/styles` so position/launcher work even when the
4
+ * host Tailwind scan does not include this package.
5
+ */
6
+
7
+ .mailoo-chat-root {
8
+ --mailoo-chat-brand: #2563eb;
9
+ --mailoo-chat-brand-on: #ffffff;
10
+ pointer-events: auto;
11
+ position: fixed;
12
+ z-index: 200;
13
+ bottom: 1.25rem;
14
+ inset-inline-end: 1.25rem;
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: flex-end;
18
+ gap: 0.5rem;
19
+ isolation: isolate;
20
+ transform: translateZ(0);
21
+ }
22
+
23
+ .mailoo-chat-root--left {
24
+ inset-inline-end: auto;
25
+ inset-inline-start: 1.25rem;
26
+ align-items: flex-start;
27
+ }
28
+
29
+ .mailoo-chat-root--top {
30
+ top: 1.25rem;
31
+ bottom: auto;
32
+ flex-direction: column-reverse;
33
+ }
34
+
35
+ .mailoo-chat-root--middle {
36
+ top: 50%;
37
+ bottom: auto;
38
+ transform: translate3d(0, -50%, 0);
39
+ }
40
+
41
+ .mailoo-chat-panel {
42
+ display: flex;
43
+ flex-direction: column;
44
+ overflow: hidden;
45
+ width: min(100vw - 2rem, 360px);
46
+ height: 420px;
47
+ max-height: 70vh;
48
+ min-height: 260px;
49
+ border-radius: 0.5rem;
50
+ border: 1px solid color-mix(in srgb, var(--mailoo-chat-brand) 18%, #e5e7eb);
51
+ background: #ffffff;
52
+ box-shadow:
53
+ var(--elev-raised, 0 20px 40px rgba(15, 23, 42, 0.18));
54
+ color: #111827;
55
+ }
56
+
57
+ html[data-theme='dark'] .mailoo-chat-panel {
58
+ border-color: color-mix(in srgb, var(--mailoo-chat-brand) 28%, #374151);
59
+ background: #111827;
60
+ color: #f9fafb;
61
+ }
62
+
63
+ .mailoo-chat-launcher {
64
+ position: relative;
65
+ display: inline-flex;
66
+ height: 3.5rem;
67
+ width: 3.5rem;
68
+ flex-shrink: 0;
69
+ align-items: center;
70
+ justify-content: center;
71
+ border: none;
72
+ border-radius: 9999px;
73
+ background: var(--mailoo-chat-brand);
74
+ color: var(--mailoo-chat-brand-on);
75
+ box-shadow:
76
+ var(--elev-raised, 0 10px 24px rgba(15, 23, 42, 0.22));
77
+ cursor: pointer;
78
+ transition: opacity 0.15s ease, transform 0.15s ease;
79
+ }
80
+
81
+ .mailoo-chat-launcher:hover {
82
+ opacity: 0.92;
83
+ transform: translateY(-1px);
84
+ }
85
+
86
+ .mailoo-chat-launcher:focus-visible {
87
+ outline: 2px solid var(--mailoo-chat-brand);
88
+ outline-offset: 3px;
89
+ }
90
+
91
+ .mailoo-chat-launcher__icon {
92
+ height: 1.5rem;
93
+ width: 1.5rem;
94
+ }
95
+
96
+ .mailoo-chat-launcher__online {
97
+ position: absolute;
98
+ right: 0.2rem;
99
+ bottom: 0.2rem;
100
+ height: 0.7rem;
101
+ width: 0.7rem;
102
+ border-radius: 9999px;
103
+ border: 2px solid var(--mailoo-chat-brand);
104
+ background: #22c55e;
105
+ pointer-events: none;
106
+ }
107
+
108
+ .mailoo-chat-bubble--outbound {
109
+ background: color-mix(in srgb, var(--mailoo-chat-brand) 14%, #ffffff);
110
+ }
111
+
112
+ html[data-theme='dark'] .mailoo-chat-bubble--outbound {
113
+ background: color-mix(in srgb, var(--mailoo-chat-brand) 28%, #111827);
114
+ }
115
+
116
+ .mailoo-chat-bubble--inbound {
117
+ background: #f3f4f6;
118
+ }
119
+
120
+ html[data-theme='dark'] .mailoo-chat-bubble--inbound {
121
+ background: #1f2937;
122
+ }