@mrrocket/sdk 0.9.0 → 0.10.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.
- package/CHANGELOG.md +7 -0
- package/dist/api-client.d.ts +8 -0
- package/dist/api-client.js +13 -1
- package/dist/api-client.js.map +1 -1
- package/dist/browser/mrrocket-messenger.js +85 -50
- package/dist/browser/mrrocket.js +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +1 -1
- package/dist/core.js.map +1 -1
- package/dist/feedback.js +127 -22
- package/dist/feedback.js.map +1 -1
- package/dist/messenger-ui.d.ts +2 -0
- package/dist/messenger-ui.js +54 -18
- package/dist/messenger-ui.js.map +1 -1
- package/dist/react-native/index.d.cts +12 -2
- package/dist/react-native/index.d.ts +12 -2
- package/dist/react-native/index.js +201 -47
- package/dist/react-native/index.js.map +1 -1
- package/dist/styles-css.d.ts +1 -1
- package/dist/styles-css.js +83 -48
- package/dist/styles-css.js.map +1 -1
- package/package.json +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this package. It follows semantic versioning; before 1.0 a minor version may change an API.
|
|
4
4
|
|
|
5
|
+
## 0.10.0
|
|
6
|
+
|
|
7
|
+
- **Messenger, new look (web and apps):** Home opens under a head in your color with the greeting large on it, then cards: the recent chat with the team's mark, "Send us a message" with how soon you reply, and help search with the top articles. The chat has a round send button in one rounded field, softer bubbles and the reply time in its head; the launcher is larger, turns into a cross when open and takes a dark text on a light color. React Native draws the same: line icons with the optional `react-native-svg` (text glyphs without it).
|
|
8
|
+
- **More from MRRocket › Support › Messenger:** `replyTime` ("minutes", "hours", "day") and, for apps, `appLauncher` (a chat button in the app) plus the side, the button text and Sound (a light haptic in apps), which React Native now reads too. What the code passes still wins.
|
|
9
|
+
- New in `api-client`: `replyLine(replyTime)` and `inkOn(color)`.
|
|
10
|
+
- Version reported in event batches: `0.10.0`.
|
|
11
|
+
|
|
5
12
|
## 0.9.0
|
|
6
13
|
|
|
7
14
|
- **Messenger, after Featurebase's:** `<Messenger />` (Next.js / React), the script tag (`data-messenger="true"`) and React Native (`<MRRocketProvider messenger={{ launcher: true }}>`, `useMessenger()`) show a chat bubble with three tabs: **Home** (greeting, the latest chat, help search, top articles), **Messages** (the chat with your team; it lands in MRRocket › Support, answered by you or the Customer experience agent) and **Help** (your published help articles from Support › Help center, by collection, searchable, read in the panel with "Did this answer your question?"). An answer that drew on an article links it.
|
package/dist/api-client.d.ts
CHANGED
|
@@ -132,11 +132,19 @@ export interface MessengerLook {
|
|
|
132
132
|
title: string;
|
|
133
133
|
greeting: string;
|
|
134
134
|
label: string;
|
|
135
|
+
/** How soon the team usually answers (MRRocket from 0.10; older servers leave it out). */
|
|
136
|
+
replyTime?: "minutes" | "hours" | "day";
|
|
137
|
+
/** A round chat button in the app (React Native) too. */
|
|
138
|
+
appLauncher?: boolean;
|
|
135
139
|
help: boolean;
|
|
136
140
|
sound: boolean;
|
|
137
141
|
preview: boolean;
|
|
138
142
|
askEmail: boolean;
|
|
139
143
|
}
|
|
144
|
+
/** The line under "Send us a message" and in the chat's head. */
|
|
145
|
+
export declare const replyLine: (t: MessengerLook["replyTime"]) => "We usually reply in a few minutes" | "We usually reply within a day" | "We usually reply in a few hours";
|
|
146
|
+
/** Black or white, whichever reads better on the accent (a light custom color gets dark text). */
|
|
147
|
+
export declare const inkOn: (hex: string) => "#ffffff" | "#111214";
|
|
140
148
|
/** The visitor's newest chat (open or closed) and its messages. */
|
|
141
149
|
export interface ChatThread {
|
|
142
150
|
conversation: {
|
package/dist/api-client.js
CHANGED
|
@@ -5,6 +5,16 @@ var STATUS_LABEL = {
|
|
|
5
5
|
progress: "In progress",
|
|
6
6
|
shipped: "Shipped"
|
|
7
7
|
};
|
|
8
|
+
var replyLine = (t) => t === "minutes" ? "We usually reply in a few minutes" : t === "day" ? "We usually reply within a day" : "We usually reply in a few hours";
|
|
9
|
+
var inkOn = (hex) => {
|
|
10
|
+
const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex);
|
|
11
|
+
if (!m) return "#ffffff";
|
|
12
|
+
const [r, g, b] = [m[1], m[2], m[3]].map((x) => {
|
|
13
|
+
const c = parseInt(x, 16) / 255;
|
|
14
|
+
return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
15
|
+
});
|
|
16
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b > 0.45 ? "#111214" : "#ffffff";
|
|
17
|
+
};
|
|
8
18
|
var ApiError = class extends Error {
|
|
9
19
|
status;
|
|
10
20
|
constructor(message, status) {
|
|
@@ -62,6 +72,8 @@ var createApi = (c) => {
|
|
|
62
72
|
export {
|
|
63
73
|
ApiError,
|
|
64
74
|
STATUS_LABEL,
|
|
65
|
-
createApi
|
|
75
|
+
createApi,
|
|
76
|
+
inkOn,
|
|
77
|
+
replyLine
|
|
66
78
|
};
|
|
67
79
|
//# sourceMappingURL=api-client.js.map
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api-client.ts"],"sourcesContent":["/**\n * The SDK's fetch client and the shapes it reads, without React, so the script tag's widgets (src/script) use it too.\n * `./api` re-exports all of it with the `useApi` hook.\n */\nexport type PostStatus = \"review\" | \"planned\" | \"progress\" | \"shipped\";\n\nexport const STATUS_LABEL: Record<PostStatus, string> = {\n review: \"Under review\",\n planned: \"Planned\",\n progress: \"In progress\",\n shipped: \"Shipped\",\n};\n\nexport interface FeedbackBoardInfo {\n id: string;\n label: string;\n}\n\nexport interface FeedbackPost {\n id: string;\n title: string;\n body: string;\n board: string;\n status: PostStatus;\n votes: number;\n comments: number;\n voted: boolean;\n createdAt: string;\n /** \"Lena K.\", \"Anonymous\" or \"Team\". Missing from servers before SDK 0.6. */\n author?: string;\n}\n\n/** The product's public face for the board's header. */\nexport interface FeedbackProduct {\n name: string;\n logo: string | null;\n /** The domain's favicon, tried when `logo` does not load. Older servers leave it out. */\n logoFallback?: string | null;\n}\n\nexport interface FeedbackList {\n boards: FeedbackBoardInfo[];\n posts: FeedbackPost[];\n product?: FeedbackProduct;\n}\n\nexport interface FeedbackRoadmap {\n /** `review` (Backlog) comes from servers of SDK 0.6 on. */\n columns: { review?: FeedbackPost[]; planned: FeedbackPost[]; progress: FeedbackPost[]; shipped: FeedbackPost[] };\n}\n\nexport interface ChangelogEntry {\n id: string;\n title: string;\n body: string;\n publishedAt: string;\n}\n\nexport interface FeedbackComment {\n id: string;\n body: string;\n author: string;\n isTeam: boolean;\n postedAt: string;\n}\n\nexport type SurveyQuestionKind = \"nps\" | \"rating\" | \"single\" | \"multi\" | \"text\";\n\nexport interface SurveyQuestion {\n key: string;\n kind: SurveyQuestionKind;\n title: string;\n description?: string;\n required: boolean;\n options?: string[];\n scale?: number;\n low?: string;\n high?: string;\n placeholder?: string;\n}\n\nexport interface SurveyDefinition {\n id: string;\n name: string;\n type: string;\n thanks: string;\n questions: SurveyQuestion[];\n}\n\nexport type SurveyAnswer = number | string | string[];\n\n/** One message of the messenger's chat. \"visitor\" is the person on the site; the rest come from the product's team. */\nexport interface ChatMessage {\n id: string;\n from: \"visitor\" | \"team\" | \"ai\" | \"auto\";\n body: string;\n at: string;\n /** Help articles an answer drew on (servers from SDK 0.9 on). */\n articles?: { id: string; title: string }[];\n}\n\n/** A published help article in a list (the messenger's Help tab). */\nexport interface ArticleSummary {\n id: string;\n title: string;\n collection: string;\n excerpt: string;\n updatedAt: string;\n}\n\n/** A run of text inside an article block. Links are http(s), mailto or tel only. */\nexport interface ArticleSpan {\n text: string;\n href?: string;\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n}\n\n/** An article's content as blocks, written with textContent (never parsed as HTML). */\nexport type ArticleBlock =\n | { type: \"h2\" | \"h3\" | \"p\" | \"quote\"; spans: ArticleSpan[] }\n | { type: \"ul\" | \"ol\"; items: ArticleSpan[][] }\n | { type: \"code\"; text: string }\n | { type: \"hr\" };\n\nexport interface Article {\n id: string;\n title: string;\n collection: string;\n updatedAt: string;\n blocks: ArticleBlock[];\n}\n\n/** The messenger's look and texts as set in MRRocket › Support › Messenger (servers from SDK 0.9 on). */\nexport interface MessengerLook {\n accent: string;\n theme: \"light\" | \"dark\" | \"auto\";\n position: \"bottom-right\" | \"bottom-left\";\n title: string;\n greeting: string;\n label: string;\n help: boolean;\n sound: boolean;\n preview: boolean;\n askEmail: boolean;\n}\n\n/** The visitor's newest chat (open or closed) and its messages. */\nexport interface ChatThread {\n conversation: { id: string; status: \"open\" | \"solved\" } | null;\n messages: ChatMessage[];\n /** The visitor gave an email already: the messenger stops asking. */\n hasEmail: boolean;\n}\n\nexport class ApiError extends Error {\n status: number;\n constructor(message: string, status: number) {\n super(message);\n this.status = status;\n }\n}\n\ninterface Conn {\n host: string;\n apiKey: string;\n distinctId: string;\n user?: { id?: string; [key: string]: unknown };\n}\n\n// Not URLSearchParams: React Native's lacks `set` in older versions, and the apps use this client too.\nconst qs = (params: Record<string, string | undefined>) =>\n Object.entries(params)\n .filter((e): e is [string, string] => !!e[1])\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join(\"&\");\n\nconst call = async <T>(url: string, init: RequestInit | undefined, signal?: AbortSignal): Promise<T> => {\n let res: Response;\n try {\n res = await fetch(url, {\n ...init,\n signal,\n headers: init?.body ? { \"content-type\": \"application/json\" } : undefined,\n });\n } catch (e) {\n if ((e as Error).name === \"AbortError\") throw e;\n throw new ApiError(\"Could not reach the server. Check your connection and try again.\", 0);\n }\n if (!res.ok) {\n let detail = \"\";\n try {\n detail = ((await res.json()) as { error?: string }).error ?? \"\";\n } catch {\n // Not JSON; the status is enough.\n }\n throw new ApiError(detail || (res.status === 429 ? \"Too many requests. Try again in a minute.\" : \"Something went wrong. Please try again.\"), res.status);\n }\n return (await res.json()) as T;\n};\n\n/** The small fetch client behind the widgets. Every read takes an AbortSignal so unmounting cancels it. */\nexport const createApi = (c: Conn) => {\n const base = `${c.host}/api/sdk`;\n const who = { key: c.apiKey, distinctId: c.distinctId, user: c.user };\n const post = <T>(path: string, body: Record<string, unknown>, signal?: AbortSignal) =>\n call<T>(`${base}${path}`, { method: \"POST\", body: JSON.stringify({ ...who, ...body }) }, signal);\n return {\n list: (o: { board?: string; sort?: \"top\" | \"new\"; q?: string }, signal?: AbortSignal) =>\n call<FeedbackList>(`${base}/feedback?${qs({ key: c.apiKey, distinctId: c.distinctId, board: o.board, sort: o.sort, q: o.q })}`, undefined, signal),\n post: (id: string, signal?: AbortSignal) =>\n call<FeedbackPost>(`${base}/feedback/${encodeURIComponent(id)}?${qs({ key: c.apiKey, distinctId: c.distinctId })}`, undefined, signal),\n roadmap: (signal?: AbortSignal) => call<FeedbackRoadmap>(`${base}/feedback/roadmap?${qs({ key: c.apiKey, distinctId: c.distinctId })}`, undefined, signal),\n changelog: (signal?: AbortSignal) => call<{ entries: ChangelogEntry[] }>(`${base}/feedback/changelog?${qs({ key: c.apiKey })}`, undefined, signal),\n submit: (p: { title: string; body?: string; board: string }) => post<FeedbackPost>(\"/feedback\", p),\n vote: (id: string) => post<{ voted: boolean; votes: number }>(`/feedback/${encodeURIComponent(id)}/vote`, {}),\n comments: (id: string, signal?: AbortSignal) =>\n call<{ comments: FeedbackComment[] }>(`${base}/feedback/${encodeURIComponent(id)}/comments?${qs({ key: c.apiKey })}`, undefined, signal),\n comment: (id: string, body: string) => post<FeedbackComment>(`/feedback/${encodeURIComponent(id)}/comments`, { body }),\n survey: (url: string, signal?: AbortSignal) =>\n call<{ survey: SurveyDefinition | null }>(`${base}/surveys?${qs({ key: c.apiKey, distinctId: c.distinctId, url })}`, undefined, signal),\n seen: (id: string) => post<unknown>(`/surveys/${encodeURIComponent(id)}/seen`, { user: undefined }),\n respond: (id: string, r: { answers: Record<string, SurveyAnswer>; completed: boolean; seconds: number }) =>\n post<unknown>(`/surveys/${encodeURIComponent(id)}/respond`, r),\n chat: (signal?: AbortSignal) => call<ChatThread>(`${base}/messages?${qs({ key: c.apiKey, distinctId: c.distinctId })}`, undefined, signal),\n sendChat: (m: { body: string; email?: string; url?: string }) => post<ChatThread>(\"/messages\", m),\n articles: (q?: string, signal?: AbortSignal) => call<{ articles: ArticleSummary[] }>(`${base}/articles?${qs({ key: c.apiKey, q })}`, undefined, signal),\n article: (id: string, signal?: AbortSignal) =>\n call<Article>(`${base}/articles/${encodeURIComponent(id)}?${qs({ key: c.apiKey, distinctId: c.distinctId })}`, undefined, signal),\n messengerLook: (signal?: AbortSignal) => call<MessengerLook>(`${base}/messenger?${qs({ key: c.apiKey })}`, undefined, signal),\n rateArticle: (id: string, helpful: boolean) => post<{ counted: boolean }>(`/articles/${encodeURIComponent(id)}/rate`, { helpful }),\n };\n};\n\nexport type Api = ReturnType<typeof createApi>;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/api-client.ts"],"sourcesContent":["/**\n * The SDK's fetch client and the shapes it reads, without React, so the script tag's widgets (src/script) use it too.\n * `./api` re-exports all of it with the `useApi` hook.\n */\nexport type PostStatus = \"review\" | \"planned\" | \"progress\" | \"shipped\";\n\nexport const STATUS_LABEL: Record<PostStatus, string> = {\n review: \"Under review\",\n planned: \"Planned\",\n progress: \"In progress\",\n shipped: \"Shipped\",\n};\n\nexport interface FeedbackBoardInfo {\n id: string;\n label: string;\n}\n\nexport interface FeedbackPost {\n id: string;\n title: string;\n body: string;\n board: string;\n status: PostStatus;\n votes: number;\n comments: number;\n voted: boolean;\n createdAt: string;\n /** \"Lena K.\", \"Anonymous\" or \"Team\". Missing from servers before SDK 0.6. */\n author?: string;\n}\n\n/** The product's public face for the board's header. */\nexport interface FeedbackProduct {\n name: string;\n logo: string | null;\n /** The domain's favicon, tried when `logo` does not load. Older servers leave it out. */\n logoFallback?: string | null;\n}\n\nexport interface FeedbackList {\n boards: FeedbackBoardInfo[];\n posts: FeedbackPost[];\n product?: FeedbackProduct;\n}\n\nexport interface FeedbackRoadmap {\n /** `review` (Backlog) comes from servers of SDK 0.6 on. */\n columns: { review?: FeedbackPost[]; planned: FeedbackPost[]; progress: FeedbackPost[]; shipped: FeedbackPost[] };\n}\n\nexport interface ChangelogEntry {\n id: string;\n title: string;\n body: string;\n publishedAt: string;\n}\n\nexport interface FeedbackComment {\n id: string;\n body: string;\n author: string;\n isTeam: boolean;\n postedAt: string;\n}\n\nexport type SurveyQuestionKind = \"nps\" | \"rating\" | \"single\" | \"multi\" | \"text\";\n\nexport interface SurveyQuestion {\n key: string;\n kind: SurveyQuestionKind;\n title: string;\n description?: string;\n required: boolean;\n options?: string[];\n scale?: number;\n low?: string;\n high?: string;\n placeholder?: string;\n}\n\nexport interface SurveyDefinition {\n id: string;\n name: string;\n type: string;\n thanks: string;\n questions: SurveyQuestion[];\n}\n\nexport type SurveyAnswer = number | string | string[];\n\n/** One message of the messenger's chat. \"visitor\" is the person on the site; the rest come from the product's team. */\nexport interface ChatMessage {\n id: string;\n from: \"visitor\" | \"team\" | \"ai\" | \"auto\";\n body: string;\n at: string;\n /** Help articles an answer drew on (servers from SDK 0.9 on). */\n articles?: { id: string; title: string }[];\n}\n\n/** A published help article in a list (the messenger's Help tab). */\nexport interface ArticleSummary {\n id: string;\n title: string;\n collection: string;\n excerpt: string;\n updatedAt: string;\n}\n\n/** A run of text inside an article block. Links are http(s), mailto or tel only. */\nexport interface ArticleSpan {\n text: string;\n href?: string;\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n}\n\n/** An article's content as blocks, written with textContent (never parsed as HTML). */\nexport type ArticleBlock =\n | { type: \"h2\" | \"h3\" | \"p\" | \"quote\"; spans: ArticleSpan[] }\n | { type: \"ul\" | \"ol\"; items: ArticleSpan[][] }\n | { type: \"code\"; text: string }\n | { type: \"hr\" };\n\nexport interface Article {\n id: string;\n title: string;\n collection: string;\n updatedAt: string;\n blocks: ArticleBlock[];\n}\n\n/** The messenger's look and texts as set in MRRocket › Support › Messenger (servers from SDK 0.9 on). */\nexport interface MessengerLook {\n accent: string;\n theme: \"light\" | \"dark\" | \"auto\";\n position: \"bottom-right\" | \"bottom-left\";\n title: string;\n greeting: string;\n label: string;\n /** How soon the team usually answers (MRRocket from 0.10; older servers leave it out). */\n replyTime?: \"minutes\" | \"hours\" | \"day\";\n /** A round chat button in the app (React Native) too. */\n appLauncher?: boolean;\n help: boolean;\n sound: boolean;\n preview: boolean;\n askEmail: boolean;\n}\n\n/** The line under \"Send us a message\" and in the chat's head. */\nexport const replyLine = (t: MessengerLook[\"replyTime\"]) =>\n t === \"minutes\" ? \"We usually reply in a few minutes\" : t === \"day\" ? \"We usually reply within a day\" : \"We usually reply in a few hours\";\n\n/** Black or white, whichever reads better on the accent (a light custom color gets dark text). */\nexport const inkOn = (hex: string) => {\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex);\n if (!m) return \"#ffffff\";\n const [r, g, b] = [m[1], m[2], m[3]].map((x) => {\n const c = parseInt(x, 16) / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b > 0.45 ? \"#111214\" : \"#ffffff\";\n};\n\n/** The visitor's newest chat (open or closed) and its messages. */\nexport interface ChatThread {\n conversation: { id: string; status: \"open\" | \"solved\" } | null;\n messages: ChatMessage[];\n /** The visitor gave an email already: the messenger stops asking. */\n hasEmail: boolean;\n}\n\nexport class ApiError extends Error {\n status: number;\n constructor(message: string, status: number) {\n super(message);\n this.status = status;\n }\n}\n\ninterface Conn {\n host: string;\n apiKey: string;\n distinctId: string;\n user?: { id?: string; [key: string]: unknown };\n}\n\n// Not URLSearchParams: React Native's lacks `set` in older versions, and the apps use this client too.\nconst qs = (params: Record<string, string | undefined>) =>\n Object.entries(params)\n .filter((e): e is [string, string] => !!e[1])\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join(\"&\");\n\nconst call = async <T>(url: string, init: RequestInit | undefined, signal?: AbortSignal): Promise<T> => {\n let res: Response;\n try {\n res = await fetch(url, {\n ...init,\n signal,\n headers: init?.body ? { \"content-type\": \"application/json\" } : undefined,\n });\n } catch (e) {\n if ((e as Error).name === \"AbortError\") throw e;\n throw new ApiError(\"Could not reach the server. Check your connection and try again.\", 0);\n }\n if (!res.ok) {\n let detail = \"\";\n try {\n detail = ((await res.json()) as { error?: string }).error ?? \"\";\n } catch {\n // Not JSON; the status is enough.\n }\n throw new ApiError(detail || (res.status === 429 ? \"Too many requests. Try again in a minute.\" : \"Something went wrong. Please try again.\"), res.status);\n }\n return (await res.json()) as T;\n};\n\n/** The small fetch client behind the widgets. Every read takes an AbortSignal so unmounting cancels it. */\nexport const createApi = (c: Conn) => {\n const base = `${c.host}/api/sdk`;\n const who = { key: c.apiKey, distinctId: c.distinctId, user: c.user };\n const post = <T>(path: string, body: Record<string, unknown>, signal?: AbortSignal) =>\n call<T>(`${base}${path}`, { method: \"POST\", body: JSON.stringify({ ...who, ...body }) }, signal);\n return {\n list: (o: { board?: string; sort?: \"top\" | \"new\"; q?: string }, signal?: AbortSignal) =>\n call<FeedbackList>(`${base}/feedback?${qs({ key: c.apiKey, distinctId: c.distinctId, board: o.board, sort: o.sort, q: o.q })}`, undefined, signal),\n post: (id: string, signal?: AbortSignal) =>\n call<FeedbackPost>(`${base}/feedback/${encodeURIComponent(id)}?${qs({ key: c.apiKey, distinctId: c.distinctId })}`, undefined, signal),\n roadmap: (signal?: AbortSignal) => call<FeedbackRoadmap>(`${base}/feedback/roadmap?${qs({ key: c.apiKey, distinctId: c.distinctId })}`, undefined, signal),\n changelog: (signal?: AbortSignal) => call<{ entries: ChangelogEntry[] }>(`${base}/feedback/changelog?${qs({ key: c.apiKey })}`, undefined, signal),\n submit: (p: { title: string; body?: string; board: string }) => post<FeedbackPost>(\"/feedback\", p),\n vote: (id: string) => post<{ voted: boolean; votes: number }>(`/feedback/${encodeURIComponent(id)}/vote`, {}),\n comments: (id: string, signal?: AbortSignal) =>\n call<{ comments: FeedbackComment[] }>(`${base}/feedback/${encodeURIComponent(id)}/comments?${qs({ key: c.apiKey })}`, undefined, signal),\n comment: (id: string, body: string) => post<FeedbackComment>(`/feedback/${encodeURIComponent(id)}/comments`, { body }),\n survey: (url: string, signal?: AbortSignal) =>\n call<{ survey: SurveyDefinition | null }>(`${base}/surveys?${qs({ key: c.apiKey, distinctId: c.distinctId, url })}`, undefined, signal),\n seen: (id: string) => post<unknown>(`/surveys/${encodeURIComponent(id)}/seen`, { user: undefined }),\n respond: (id: string, r: { answers: Record<string, SurveyAnswer>; completed: boolean; seconds: number }) =>\n post<unknown>(`/surveys/${encodeURIComponent(id)}/respond`, r),\n chat: (signal?: AbortSignal) => call<ChatThread>(`${base}/messages?${qs({ key: c.apiKey, distinctId: c.distinctId })}`, undefined, signal),\n sendChat: (m: { body: string; email?: string; url?: string }) => post<ChatThread>(\"/messages\", m),\n articles: (q?: string, signal?: AbortSignal) => call<{ articles: ArticleSummary[] }>(`${base}/articles?${qs({ key: c.apiKey, q })}`, undefined, signal),\n article: (id: string, signal?: AbortSignal) =>\n call<Article>(`${base}/articles/${encodeURIComponent(id)}?${qs({ key: c.apiKey, distinctId: c.distinctId })}`, undefined, signal),\n messengerLook: (signal?: AbortSignal) => call<MessengerLook>(`${base}/messenger?${qs({ key: c.apiKey })}`, undefined, signal),\n rateArticle: (id: string, helpful: boolean) => post<{ counted: boolean }>(`/articles/${encodeURIComponent(id)}/rate`, { helpful }),\n };\n};\n\nexport type Api = ReturnType<typeof createApi>;\n"],"mappings":"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","names":[]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
(function(){'use strict';var
|
|
2
|
-
.ckw-root{--ckw-accent:#3f76ff;--ckw-accent-ink:#fff;--ckw-bg:#fff;--ckw-bg2:#f7f7f8;--ckw-bg3:#eeeff1;--ckw-fg:#1c1d20;--ckw-fg2:#5d6068;--ckw-fg3:#8b8e96;--ckw-line:#e4e5e8;--ckw-danger:#d92d20;--ckw-shadow:0 8px 30px rgba(16,18,24,.16);--ckw-card:#fff;--ckw-col:#f5f6f7;--ckw-lift:0 1px 2px rgba(16,18,24,.06),0 0 0 1px rgba(16,18,24,.07);
|
|
1
|
+
(function(){'use strict';var pt=Object.defineProperty;var lt=(r,a,n)=>a in r?pt(r,a,{enumerable:true,configurable:true,writable:true,value:n}):r[a]=n;var Qe=(r,a,n)=>lt(r,a+"",n);var Je=r=>r==="minutes"?"We usually reply in a few minutes":r==="day"?"We usually reply within a day":"We usually reply in a few hours",Xe=r=>{let a=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(r);if(!a)return "#ffffff";let[n,p,i]=[a[1],a[2],a[3]].map(s=>{let x=parseInt(s,16)/255;return x<=.03928?x/12.92:((x+.055)/1.055)**2.4});return .2126*n+.7152*p+.0722*i>.45?"#111214":"#ffffff"},oe=class extends Error{constructor(n,p){super(n);Qe(this,"status");this.status=p;}},L=r=>Object.entries(r).filter(a=>!!a[1]).map(([a,n])=>`${encodeURIComponent(a)}=${encodeURIComponent(n)}`).join("&"),S=async(r,a,n)=>{var i;let p;try{p=await fetch(r,{...a,signal:n,headers:a!=null&&a.body?{"content-type":"application/json"}:void 0});}catch(s){throw s.name==="AbortError"?s:new oe("Could not reach the server. Check your connection and try again.",0)}if(!p.ok){let s="";try{s=(i=(await p.json()).error)!=null?i:"";}catch(x){}throw new oe(s||(p.status===429?"Too many requests. Try again in a minute.":"Something went wrong. Please try again."),p.status)}return await p.json()},ve=r=>{let a=`${r.host}/api/sdk`,n={key:r.apiKey,distinctId:r.distinctId,user:r.user},p=(i,s,x)=>S(`${a}${i}`,{method:"POST",body:JSON.stringify({...n,...s})},x);return {list:(i,s)=>S(`${a}/feedback?${L({key:r.apiKey,distinctId:r.distinctId,board:i.board,sort:i.sort,q:i.q})}`,void 0,s),post:(i,s)=>S(`${a}/feedback/${encodeURIComponent(i)}?${L({key:r.apiKey,distinctId:r.distinctId})}`,void 0,s),roadmap:i=>S(`${a}/feedback/roadmap?${L({key:r.apiKey,distinctId:r.distinctId})}`,void 0,i),changelog:i=>S(`${a}/feedback/changelog?${L({key:r.apiKey})}`,void 0,i),submit:i=>p("/feedback",i),vote:i=>p(`/feedback/${encodeURIComponent(i)}/vote`,{}),comments:(i,s)=>S(`${a}/feedback/${encodeURIComponent(i)}/comments?${L({key:r.apiKey})}`,void 0,s),comment:(i,s)=>p(`/feedback/${encodeURIComponent(i)}/comments`,{body:s}),survey:(i,s)=>S(`${a}/surveys?${L({key:r.apiKey,distinctId:r.distinctId,url:i})}`,void 0,s),seen:i=>p(`/surveys/${encodeURIComponent(i)}/seen`,{user:void 0}),respond:(i,s)=>p(`/surveys/${encodeURIComponent(i)}/respond`,s),chat:i=>S(`${a}/messages?${L({key:r.apiKey,distinctId:r.distinctId})}`,void 0,i),sendChat:i=>p("/messages",i),articles:(i,s)=>S(`${a}/articles?${L({key:r.apiKey,q:i})}`,void 0,s),article:(i,s)=>S(`${a}/articles/${encodeURIComponent(i)}?${L({key:r.apiKey,distinctId:r.distinctId})}`,void 0,s),messengerLook:i=>S(`${a}/messenger?${L({key:r.apiKey})}`,void 0,i),rateArticle:(i,s)=>p(`/articles/${encodeURIComponent(i)}/rate`,{helpful:s})}};var Ze="ckw-styles",dt=`
|
|
2
|
+
.ckw-root{--ckw-accent:#3f76ff;--ckw-accent-ink:#fff;--ckw-bg:#fff;--ckw-bg2:#f7f7f8;--ckw-bg3:#eeeff1;--ckw-fg:#1c1d20;--ckw-fg2:#5d6068;--ckw-fg3:#8b8e96;--ckw-line:#e4e5e8;--ckw-danger:#d92d20;--ckw-shadow:0 8px 30px rgba(16,18,24,.16);--ckw-card:#fff;--ckw-col:#f5f6f7;--ckw-lift:0 1px 2px rgba(16,18,24,.06),0 0 0 1px rgba(16,18,24,.07);--ckw-raise:0 0 0 1px rgba(16,18,24,.05),0 1px 2px rgba(16,18,24,.05),0 6px 18px rgba(16,18,24,.06);--ckw-float:0 0 0 1px rgba(16,18,24,.06),0 18px 50px rgba(16,18,24,.2);
|
|
3
3
|
font-size:14px;line-height:1.45;font-family:inherit;color:var(--ckw-fg);box-sizing:border-box;-webkit-font-smoothing:antialiased}
|
|
4
|
-
.ckw-root[data-theme=dark]{--ckw-bg:#111214;--ckw-bg2:#1a1b1f;--ckw-bg3:#26272c;--ckw-fg:#f1f2f4;--ckw-fg2:#a9acb3;--ckw-fg3:#7a7d86;--ckw-line:#2a2b31;--ckw-shadow:0 8px 30px rgba(0,0,0,.5);--ckw-card:#1b1c20;--ckw-col:#16171a;--ckw-lift:0 0 0 1px rgba(255,255,255,.07)}
|
|
5
|
-
@media (prefers-color-scheme:dark){.ckw-root[data-theme=auto]{--ckw-bg:#111214;--ckw-bg2:#1a1b1f;--ckw-bg3:#26272c;--ckw-fg:#f1f2f4;--ckw-fg2:#a9acb3;--ckw-fg3:#7a7d86;--ckw-line:#2a2b31;--ckw-shadow:0 8px 30px rgba(0,0,0,.5);--ckw-card:#1b1c20;--ckw-col:#16171a;--ckw-lift:0 0 0 1px rgba(255,255,255,.07)}}
|
|
4
|
+
.ckw-root[data-theme=dark]{--ckw-bg:#111214;--ckw-bg2:#1a1b1f;--ckw-bg3:#26272c;--ckw-fg:#f1f2f4;--ckw-fg2:#a9acb3;--ckw-fg3:#7a7d86;--ckw-line:#2a2b31;--ckw-shadow:0 8px 30px rgba(0,0,0,.5);--ckw-card:#1b1c20;--ckw-col:#16171a;--ckw-lift:0 0 0 1px rgba(255,255,255,.07);--ckw-raise:0 0 0 1px rgba(255,255,255,.07);--ckw-float:0 0 0 1px rgba(255,255,255,.09),0 18px 50px rgba(0,0,0,.55)}
|
|
5
|
+
@media (prefers-color-scheme:dark){.ckw-root[data-theme=auto]{--ckw-bg:#111214;--ckw-bg2:#1a1b1f;--ckw-bg3:#26272c;--ckw-fg:#f1f2f4;--ckw-fg2:#a9acb3;--ckw-fg3:#7a7d86;--ckw-line:#2a2b31;--ckw-shadow:0 8px 30px rgba(0,0,0,.5);--ckw-card:#1b1c20;--ckw-col:#16171a;--ckw-lift:0 0 0 1px rgba(255,255,255,.07);--ckw-raise:0 0 0 1px rgba(255,255,255,.07);--ckw-float:0 0 0 1px rgba(255,255,255,.09),0 18px 50px rgba(0,0,0,.55)}}
|
|
6
6
|
.ckw-root *,.ckw-root *::before,.ckw-root *::after{box-sizing:border-box}
|
|
7
7
|
:where(.ckw-root) :where(button,input,select,textarea){font:inherit;color:inherit;margin:0}
|
|
8
8
|
.ckw-root button{cursor:pointer}
|
|
@@ -52,7 +52,8 @@ font-size:14px;line-height:1.45;font-family:inherit;color:var(--ckw-fg);box-sizi
|
|
|
52
52
|
.ckw-root[data-theme=dark] .ckw-pill[data-s=shipped]{color:#4ade80}
|
|
53
53
|
@media (prefers-color-scheme:dark){.ckw-root[data-theme=auto] .ckw-pill[data-s=progress]{color:#fbbf24}.ckw-root[data-theme=auto] .ckw-pill[data-s=shipped]{color:#4ade80}}
|
|
54
54
|
.ckw-stat{display:inline-flex;align-items:center;gap:4px}
|
|
55
|
-
.ckw-empty{
|
|
55
|
+
.ckw-empty{padding:64px 16px;text-align:center;color:var(--ckw-fg2)}
|
|
56
|
+
.ckw-empty-icon{display:block;width:56px;height:56px;margin:0 auto 14px;opacity:.3}
|
|
56
57
|
.ckw-error{border:1px solid color-mix(in srgb,var(--ckw-danger) 40%,transparent);background:color-mix(in srgb,var(--ckw-danger) 8%,transparent);color:var(--ckw-danger);border-radius:8px;padding:8px 10px;font-size:13px;display:flex;gap:8px;align-items:center;justify-content:space-between;margin-bottom:10px}
|
|
57
58
|
.ckw-skel{height:68px;border-radius:8px;background:var(--ckw-bg2);animation:ckw-sh 1.2s ease-in-out infinite;margin-bottom:6px}
|
|
58
59
|
@keyframes ckw-sh{50%{opacity:.5}}
|
|
@@ -203,50 +204,77 @@ font-size:14px;line-height:1.45;font-family:inherit;color:var(--ckw-fg);box-sizi
|
|
|
203
204
|
.ckw-pop .ckw-form{border:0;padding:0;margin:12px 0 0}
|
|
204
205
|
@media (max-width:520px){.ckw-pop{left:0!important;right:0!important;bottom:0;width:100%;max-width:100%;border-radius:12px 12px 0 0;max-height:85vh}.ckw-fab{bottom:14px}.ckw-fab[data-pos=bottom-right]{right:14px}.ckw-fab[data-pos=bottom-left]{left:14px}}
|
|
205
206
|
/* Messenger (messenger-ui.ts) */
|
|
206
|
-
.ckw-msgr-
|
|
207
|
-
.ckw-msgr-
|
|
208
|
-
.ckw-msgr-fab{position:fixed;transition:transform .15s ease-out}
|
|
207
|
+
.ckw-msgr-fab{position:fixed;bottom:20px;height:48px;padding:0 18px;gap:8px;font-size:15px;box-shadow:0 2px 4px rgba(16,18,24,.12),0 8px 24px color-mix(in srgb,var(--ckw-accent) 34%,transparent);transition:transform .16s cubic-bezier(.2,.8,.2,1)}
|
|
208
|
+
.ckw-msgr-fab:hover{transform:scale(1.05)}
|
|
209
209
|
.ckw-msgr-fab:active{transform:scale(.96)}
|
|
210
|
-
.ckw-msgr-
|
|
211
|
-
.ckw-msgr-
|
|
210
|
+
.ckw-msgr-round{width:56px;height:56px;padding:0;justify-content:center}
|
|
211
|
+
.ckw-msgr-fab .ckw-turn{animation:ckw-turn .22s cubic-bezier(.2,.8,.2,1)}
|
|
212
|
+
@keyframes ckw-turn{from{opacity:0;transform:rotate(-70deg) scale(.6)}}
|
|
213
|
+
.ckw-msgr-count{position:absolute;top:-2px;right:-2px;min-width:20px;height:20px;padding:0 5px;border-radius:10px;background:var(--ckw-danger);color:#fff;font-size:11px;font-weight:700;line-height:20px;text-align:center;box-shadow:0 0 0 2px var(--ckw-bg);font-variant-numeric:tabular-nums}
|
|
214
|
+
.ckw-msgr-av{width:36px;height:36px;border-radius:50%;flex:none;display:inline-flex;align-items:center;justify-content:center;background:var(--ckw-accent);color:var(--ckw-accent-ink);font-size:15px;font-weight:700;line-height:1}
|
|
215
|
+
.ckw-msgr-av-sm{width:26px;height:26px;font-size:12px}
|
|
216
|
+
.ckw-msgr-preview{position:fixed;z-index:2147483000;bottom:88px;width:320px;max-width:calc(100vw - 32px);animation:ckw-in .22s cubic-bezier(.2,.8,.2,1)}
|
|
212
217
|
.ckw-msgr-preview[data-pos=bottom-right]{right:20px}
|
|
213
218
|
.ckw-msgr-preview[data-pos=bottom-left]{left:20px}
|
|
214
|
-
.ckw-msgr-preview-card{display:flex;flex-
|
|
219
|
+
.ckw-msgr-preview-card{display:flex;align-items:flex-start;gap:12px;width:100%;text-align:left;padding:14px 16px;border:0;border-radius:18px;background:var(--ckw-bg);box-shadow:var(--ckw-float)}
|
|
220
|
+
.ckw-msgr-preview-main{display:flex;flex-direction:column;gap:2px;min-width:0}
|
|
215
221
|
.ckw-msgr-preview-who{font-size:12px;font-weight:600;color:var(--ckw-fg3)}
|
|
216
222
|
.ckw-msgr-preview-text{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;white-space:pre-wrap;overflow-wrap:anywhere}
|
|
217
|
-
.ckw-msgr-preview-x{position:absolute;top:-8px;right:-8px;width:
|
|
218
|
-
.ckw-msgr{bottom:
|
|
219
|
-
.ckw-msgr-
|
|
223
|
+
.ckw-msgr-preview-x{position:absolute;top:-8px;right:-8px;width:24px;height:24px;border-radius:50%;border:0;background:var(--ckw-bg);color:var(--ckw-fg2);display:flex;align-items:center;justify-content:center;padding:0;box-shadow:var(--ckw-lift)}
|
|
224
|
+
.ckw-msgr{bottom:88px;width:400px;height:min(660px,calc(100vh - 108px));max-height:none;border:0;border-radius:20px;box-shadow:var(--ckw-float);animation:ckw-pop .24s cubic-bezier(.2,.8,.2,1);transform-origin:bottom right}
|
|
225
|
+
.ckw-msgr[data-pos=bottom-left]{transform-origin:bottom left}
|
|
226
|
+
@keyframes ckw-pop{from{opacity:0;transform:translateY(12px) scale(.96)}}
|
|
227
|
+
.ckw-msgr-head{gap:10px;min-height:60px;padding:12px 12px 12px 16px;border-bottom:1px solid var(--ckw-line)}
|
|
228
|
+
.ckw-msgr[data-view=home] .ckw-msgr-head{background:var(--ckw-accent);color:var(--ckw-accent-ink);border-bottom-color:transparent}
|
|
229
|
+
.ckw-msgr[data-view=home] .ckw-msgr-av{background:var(--ckw-accent-ink);color:var(--ckw-accent)}
|
|
230
|
+
.ckw-msgr[data-view=home] .ckw-msgr-x{color:inherit}
|
|
231
|
+
.ckw-msgr[data-view=home] .ckw-msgr-x:hover{background:color-mix(in srgb,var(--ckw-accent-ink) 16%,transparent)}
|
|
220
232
|
.ckw-msgr-head-t{flex:1}
|
|
221
|
-
.ckw-msgr-x{width:
|
|
222
|
-
.ckw-msgr-brand{font-size:15px}
|
|
223
|
-
.ckw-msgr-
|
|
224
|
-
.ckw-msgr
|
|
225
|
-
.ckw-msgr-
|
|
226
|
-
.ckw-msgr-
|
|
227
|
-
.ckw-msgr-
|
|
228
|
-
|
|
233
|
+
.ckw-msgr-x{width:32px;height:32px;padding:0;border-radius:10px}
|
|
234
|
+
.ckw-msgr-brand{display:inline-flex;align-items:center;gap:10px;font-size:15px;font-weight:650;min-width:0}
|
|
235
|
+
.ckw-msgr-brand span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
236
|
+
.ckw-msgr-who{display:flex;align-items:center;gap:10px;min-width:0;flex:1}
|
|
237
|
+
.ckw-msgr-who-t{display:flex;flex-direction:column;min-width:0;font-weight:400}
|
|
238
|
+
.ckw-msgr-who-t b{font-size:15px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
239
|
+
.ckw-msgr-who-t span{font-size:12px;color:var(--ckw-fg3)}
|
|
240
|
+
.ckw-msgr-body{display:flex;flex-direction:column;gap:12px;background:var(--ckw-bg2);padding:16px}
|
|
241
|
+
.ckw-msgr[data-view=article] .ckw-msgr-body,.ckw-msgr[data-view=messages] .ckw-msgr-body{background:var(--ckw-bg)}
|
|
242
|
+
.ckw-msgr-hero{margin:-16px -16px 0;padding:10px 22px 64px;background:var(--ckw-accent);color:var(--ckw-accent-ink)}
|
|
243
|
+
.ckw-msgr-hero+*{margin-top:-52px}
|
|
244
|
+
.ckw-msgr-hello{margin:0;font-size:26px;font-weight:700;letter-spacing:-.02em;line-height:1.2;text-wrap:balance;overflow-wrap:anywhere}
|
|
245
|
+
.ckw-msgr-card{position:relative;display:flex;align-items:center;gap:12px;width:100%;text-align:left;padding:14px 16px;border:0;border-radius:16px;background:var(--ckw-card);box-shadow:var(--ckw-raise);transition:box-shadow .12s linear}
|
|
246
|
+
button.ckw-msgr-card:hover{box-shadow:var(--ckw-raise),0 0 0 1px color-mix(in srgb,var(--ckw-accent) 30%,transparent)}
|
|
229
247
|
.ckw-msgr-card-col{flex-direction:column;align-items:stretch;gap:2px;padding:8px}
|
|
230
248
|
.ckw-msgr-card-main{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
|
|
249
|
+
.ckw-msgr-card-main b{font-size:15px;font-weight:650}
|
|
231
250
|
.ckw-msgr-card-sub{color:var(--ckw-fg2);font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
232
|
-
.ckw-msgr-card
|
|
251
|
+
.ckw-msgr-card-label{font-size:12px;font-weight:600;color:var(--ckw-fg3)}
|
|
252
|
+
.ckw-msgr-card-meta{font-size:12px;color:var(--ckw-fg3)}
|
|
253
|
+
.ckw-msgr-recent{flex-direction:column;align-items:stretch;gap:10px}
|
|
254
|
+
.ckw-msgr-recent-row{display:flex;align-items:center;gap:12px;min-width:0}
|
|
255
|
+
.ckw-msgr-recent-text{color:var(--ckw-fg);font-size:14px}
|
|
256
|
+
.ckw-msgr-card .ckw-icon{color:var(--ckw-fg3)}
|
|
257
|
+
.ckw-msgr-go{width:34px;height:34px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--ckw-accent) 12%,transparent)}
|
|
258
|
+
.ckw-msgr-card .ckw-msgr-go .ckw-icon{color:var(--ckw-accent)}
|
|
233
259
|
.ckw-msgr-badge{min-width:20px;height:20px;padding:0 6px;border-radius:10px;background:var(--ckw-danger);color:#fff;font-size:12px;font-weight:700;line-height:20px;text-align:center}
|
|
234
|
-
.ckw-msgr-search{display:flex;align-items:center;gap:8px;height:
|
|
260
|
+
.ckw-msgr-search{display:flex;align-items:center;gap:8px;height:42px;padding:0 14px;border:0;border-radius:12px;background:var(--ckw-bg2);color:var(--ckw-accent);cursor:text}
|
|
261
|
+
.ckw-msgr[data-view=help] .ckw-msgr-search{background:var(--ckw-card);box-shadow:var(--ckw-raise)}
|
|
235
262
|
.ckw-msgr-card-col .ckw-msgr-search{margin-bottom:4px}
|
|
236
|
-
.ckw-msgr-search-in{flex:1;min-width:0;border:0;background:transparent;outline:none;font-size:14px}
|
|
237
|
-
.ckw-msgr-search-in
|
|
238
|
-
.ckw-msgr-search
|
|
239
|
-
.ckw-msgr-
|
|
263
|
+
.ckw-msgr-search-in{flex:1;min-width:0;border:0;background:transparent;outline:none;font-size:14px;font-weight:500;color:var(--ckw-fg)}
|
|
264
|
+
.ckw-root .ckw-msgr-search-in:focus-visible{outline:none}
|
|
265
|
+
.ckw-msgr-search-in::placeholder{color:var(--ckw-fg2)}
|
|
266
|
+
.ckw-msgr-search:focus-within{box-shadow:0 0 0 2px color-mix(in srgb,var(--ckw-accent) 45%,transparent)}
|
|
267
|
+
.ckw-msgr-art{display:flex;align-items:center;gap:8px;width:100%;text-align:left;padding:10px 8px;border:0;border-radius:10px;background:transparent;font-size:14px}
|
|
240
268
|
.ckw-msgr-art:hover{background:var(--ckw-bg2)}
|
|
241
269
|
.ckw-msgr-art-t{flex:1;min-width:0}
|
|
242
|
-
.ckw-msgr-art .ckw-icon{color:var(--ckw-
|
|
270
|
+
.ckw-msgr-art .ckw-icon{color:var(--ckw-accent)}
|
|
243
271
|
.ckw-msgr-skel{height:40px;margin:4px 0 0}
|
|
244
272
|
.ckw-msgr-group{display:flex;flex-direction:column;gap:6px}
|
|
245
273
|
.ckw-msgr-group-h{margin:4px 2px 0;font-size:12px;font-weight:600;color:var(--ckw-fg3)}
|
|
246
274
|
.ckw-msgr-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:28px 8px;text-align:center;color:var(--ckw-fg2)}
|
|
247
275
|
.ckw-msgr-empty p{margin:0}
|
|
248
276
|
.ckw-msgr-doc{display:flex;flex-direction:column;gap:6px}
|
|
249
|
-
.ckw-msgr-doc-t{margin:0;font-size:
|
|
277
|
+
.ckw-msgr-doc-t{margin:0;font-size:20px;font-weight:700;letter-spacing:-.015em;line-height:1.3}
|
|
250
278
|
.ckw-msgr-doc-c{margin:0;font-size:12px;color:var(--ckw-fg3)}
|
|
251
279
|
.ckw-msgr-doc-b{margin-top:8px;font-size:14px;line-height:1.6;overflow-wrap:anywhere}
|
|
252
280
|
.ckw-msgr-doc-b>*{margin:0 0 10px}
|
|
@@ -258,31 +286,38 @@ button.ckw-msgr-card:hover{filter:brightness(.985)}
|
|
|
258
286
|
.ckw-msgr-doc-b code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.92em}
|
|
259
287
|
.ckw-msgr-doc-b a{color:var(--ckw-accent)}
|
|
260
288
|
.ckw-msgr-doc-b hr{border:0;border-top:1px solid var(--ckw-line)}
|
|
261
|
-
.ckw-msgr-rate{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-top:8px;padding:12px;border-radius:
|
|
289
|
+
.ckw-msgr-rate{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-top:8px;padding:12px;border-radius:12px;background:var(--ckw-bg2);font-size:13px;color:var(--ckw-fg2)}
|
|
262
290
|
.ckw-msgr-rate-b{display:flex;gap:6px}
|
|
263
|
-
.ckw-msgr-ask{margin-top:6px;width:100%;height:
|
|
264
|
-
.ckw-msgr-cite{display:inline-flex;align-items:center;gap:6px;max-width:100%;padding:
|
|
291
|
+
.ckw-msgr-ask{margin-top:6px;width:100%;height:40px;border-radius:12px}
|
|
292
|
+
.ckw-msgr-cite{display:inline-flex;align-items:center;gap:6px;max-width:100%;padding:7px 10px;border:1px solid var(--ckw-line);border-radius:12px;background:var(--ckw-bg);font-size:13px;text-align:left}
|
|
293
|
+
.ckw-msgr-cite .ckw-icon{color:var(--ckw-accent)}
|
|
265
294
|
.ckw-msgr-cite span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
266
|
-
.ckw-msgr-tabs{display:flex;border-top:1px solid var(--ckw-line);background:var(--ckw-bg)}
|
|
267
|
-
.ckw-msgr-tab{position:relative;flex:1;display:flex;flex-direction:column;align-items:center;gap:
|
|
268
|
-
.ckw-msgr-tab
|
|
269
|
-
.ckw-msgr-tab
|
|
270
|
-
.ckw-msgr-
|
|
271
|
-
.ckw-
|
|
272
|
-
.ckw-
|
|
295
|
+
.ckw-msgr-tabs{display:flex;border-top:1px solid var(--ckw-line);background:var(--ckw-bg);padding:2px 8px}
|
|
296
|
+
.ckw-msgr-tab{position:relative;flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;padding:8px 0 10px;border:0;background:none;color:var(--ckw-fg3);font-size:12px;font-weight:600;transition:color .1s linear}
|
|
297
|
+
.ckw-msgr-tab:hover{color:var(--ckw-fg2)}
|
|
298
|
+
.ckw-msgr-tab[aria-current=page]{color:var(--ckw-accent)}
|
|
299
|
+
.ckw-msgr-tab .ckw-icon{width:20px;height:20px}
|
|
300
|
+
.ckw-msgr-count-tab{top:4px;right:calc(50% - 24px)}
|
|
301
|
+
.ckw-msgs{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}
|
|
302
|
+
.ckw-msg{display:flex;flex-direction:column;align-items:flex-start;gap:4px;max-width:82%}
|
|
273
303
|
.ckw-msg[data-from=me]{align-self:flex-end;align-items:flex-end}
|
|
274
|
-
.ckw-bubble{padding:
|
|
275
|
-
.ckw-msg[data-from=me] .ckw-bubble{background:var(--ckw-accent);color:var(--ckw-accent-ink);
|
|
304
|
+
.ckw-bubble{padding:9px 14px;border-radius:18px 18px 18px 6px;background:var(--ckw-bg3);white-space:pre-wrap;overflow-wrap:anywhere;font-size:14px;line-height:1.45;text-wrap:pretty}
|
|
305
|
+
.ckw-msg[data-from=me] .ckw-bubble{background:var(--ckw-accent);color:var(--ckw-accent-ink);border-radius:18px 18px 6px 18px}
|
|
276
306
|
.ckw-msg[aria-busy=true] .ckw-bubble{opacity:.7}
|
|
277
|
-
.ckw-msg-meta{font-size:11px;color:var(--ckw-fg3);font-variant-numeric:tabular-nums;padding:0
|
|
307
|
+
.ckw-msg-meta{font-size:11px;color:var(--ckw-fg3);font-variant-numeric:tabular-nums;padding:0 6px}
|
|
278
308
|
.ckw-msgr-note{margin:4px 0 0;text-align:center}
|
|
279
|
-
.ckw-msgr-compose{display:flex;flex-direction:column;gap:8px;padding:10px 12px
|
|
280
|
-
.ckw-msgr-
|
|
281
|
-
.ckw-msgr-
|
|
282
|
-
.ckw-msgr-
|
|
309
|
+
.ckw-msgr-compose{display:flex;flex-direction:column;gap:8px;padding:10px 12px 12px;background:var(--ckw-bg)}
|
|
310
|
+
.ckw-msgr-compose .ckw-input{border:0;border-radius:12px;background:var(--ckw-bg2);min-height:38px;padding:8px 14px}
|
|
311
|
+
.ckw-msgr-row{display:flex;gap:6px;align-items:flex-end;padding:5px 5px 5px 16px;border:1px solid var(--ckw-line);border-radius:22px;background:var(--ckw-bg);transition:border-color .1s linear}
|
|
312
|
+
.ckw-msgr-row:focus-within{border-color:var(--ckw-accent)}
|
|
313
|
+
.ckw-msgr-input{flex:1;min-height:32px;max-height:120px;padding:6px 0;border:0;border-radius:0;background:transparent;resize:none;field-sizing:content}
|
|
314
|
+
.ckw-root .ckw-msgr-input:focus-visible{outline:none}
|
|
315
|
+
.ckw-msgr-send{width:32px;height:32px;padding:0;flex:none;display:flex;align-items:center;justify-content:center;border:0;border-radius:50%;background:var(--ckw-accent);color:var(--ckw-accent-ink);transition:opacity .1s linear}
|
|
316
|
+
.ckw-msgr-send:disabled{background:var(--ckw-bg3);color:var(--ckw-fg3);cursor:default}
|
|
283
317
|
.ckw-msgr-error{margin:0;font-size:12px;color:var(--ckw-danger)}
|
|
284
|
-
.ckw-msgr .ckw-input[aria-invalid=true]{
|
|
285
|
-
@media (max-width:520px){.ckw-msgr{height:100dvh;bottom:0;border-radius:0}.ckw-msgr-preview{bottom:
|
|
318
|
+
.ckw-msgr .ckw-input[aria-invalid=true]{box-shadow:0 0 0 1px var(--ckw-danger)}
|
|
319
|
+
@media (max-width:520px){.ckw-msgr{height:100dvh;bottom:0;border-radius:0}.ckw-msgr-preview{bottom:80px}}
|
|
320
|
+
@media (prefers-reduced-motion:reduce){.ckw-msgr,.ckw-msgr-preview,.ckw-msgr-fab .ckw-turn{animation:none}.ckw-msgr-fab{transition:none}}
|
|
286
321
|
/* Survey */
|
|
287
322
|
.ckw-survey{position:fixed;z-index:2147483000;left:20px;bottom:20px;width:360px;max-width:calc(100vw - 24px);background:var(--ckw-bg);border:1px solid var(--ckw-line);border-radius:12px;box-shadow:var(--ckw-shadow);padding:14px;animation:ckw-in .2s ease-out}
|
|
288
323
|
@keyframes ckw-in{from{opacity:0;transform:translateY(8px)}}
|
|
@@ -309,5 +344,5 @@ button.ckw-msgr-card:hover{filter:brightness(.985)}
|
|
|
309
344
|
.ckw-sv-foot{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-top:12px}
|
|
310
345
|
.ckw-thanks{text-align:center;padding:14px 0;display:flex;flex-direction:column;align-items:center;gap:8px}
|
|
311
346
|
.ckw-tick{width:32px;height:32px;border-radius:50%;background:var(--ckw-accent);color:var(--ckw-accent-ink);display:flex;align-items:center;justify-content:center}
|
|
312
|
-
`,Ve=()=>{if(typeof document=="undefined"||document.getElementById(Be))return;let t=document.createElement("style");t.id=Be,t.textContent=at,document.head.appendChild(t);};var ot=4e3,it=8e3,ct=3e4,st=10*6e4,pt=/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,Ge="ckw_msgr_seen",ue={visitor:"You",team:"Team",ai:"AI agent",auto:"Team"},lt=()=>{var t;try{return (t=window.localStorage.getItem(Ge))!=null?t:""}catch(n){return ""}},dt=t=>{try{window.localStorage.setItem(Ge,t);}catch(n){}},Ye=t=>{let n=new Date(t).getTime();if(Number.isNaN(n))return "";let o=Math.max(0,Date.now()-n)/1e3;return o<60?"just now":o<3600?`${Math.floor(o/60)}m ago`:o<86400?`${Math.floor(o/3600)}h ago`:o<86400*30?`${Math.floor(o/86400)}d ago`:new Date(t).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})},r=(t,n={},...o)=>{let l=document.createElement(t);for(let[i,s]of Object.entries(n))l.setAttribute(i,s);for(let i of o)i!==null&&i!==false&&i!==void 0&&l.append(i);return l},We="http://www.w3.org/2000/svg",S=(t,n=16)=>{let o=document.createElementNS(We,"svg");for(let[i,s]of Object.entries({class:"ckw-icon",width:String(n),height:String(n),viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"1.7","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"}))o.setAttribute(i,s);let l=document.createElementNS(We,"path");return l.setAttribute("d",t),o.appendChild(l),o},z={cross:"m4 4 8 8M12 4l-8 8",chat:"M2.5 4.5a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v4.5a2 2 0 0 1-2 2H7l-3 2.5V11a2 2 0 0 1-1.5-2z",send:"M2.5 8h10M8.5 3.5 13 8l-4.5 4.5",home:"M2.5 7 8 2.5 13.5 7v6a1 1 0 0 1-1 1h-3v-4h-3v4h-3a1 1 0 0 1-1-1z",help:"M8 14.5A6.5 6.5 0 1 0 8 1.5a6.5 6.5 0 0 0 0 13zM6.2 6.2a1.9 1.9 0 1 1 2.6 1.8c-.5.2-.8.6-.8 1.1v.4M8 11.6v.1",back:"M10 3.5 5.5 8l4.5 4.5",next:"M6 3.5 10.5 8 6 12.5",search:"M7 11.5a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9zM10.5 10.5l3 3",doc:"M4 1.5h5.5l3 3V14a.5.5 0 0 1-.5.5H4a.5.5 0 0 1-.5-.5V2a.5.5 0 0 1 .5-.5zM9.5 1.5v3h3M6 8.5h4M6 11h4"},ne=(()=>{let t=null,n=()=>{var l;let o=(l=window.AudioContext)!=null?l:window.webkitAudioContext;return o?(t!=null||(t=new o),t):null};return {unlock:()=>{try{let o=n();(o==null?void 0:o.state)==="suspended"&&o.resume();}catch(o){}},play:()=>{try{let o=n();if(!o||o.state!=="running")return;let l=o.currentTime;[880,1318.5].forEach((i,s)=>{let u=o.createOscillator(),h=o.createGain(),g=l+s*.11;u.type="sine",u.frequency.value=i,h.gain.setValueAtTime(1e-4,g),h.gain.exponentialRampToValueAtTime(.12,g+.012),h.gain.exponentialRampToValueAtTime(1e-4,g+.32),u.connect(h),h.connect(o.destination),u.start(g),u.stop(g+.34);});}catch(o){}}}})(),ae=t=>t.map(n=>{let o=n.href?r("a",{href:n.href,target:"_blank",rel:"noopener noreferrer"},n.text):r("span",{},n.text);return n.code&&(o=r("code",{},o)),n.italic&&(o=r("em",{},o)),n.bold&&(o=r("strong",{},o)),o}),gt=t=>{switch(t.type){case "h2":case "h3":return r(t.type,{},...ae(t.spans));case "quote":return r("blockquote",{},...ae(t.spans));case "ul":case "ol":return r(t.type,{},...t.items.map(n=>r("li",{},...ae(n))));case "code":return r("pre",{},r("code",{},t.text));case "hr":return r("hr");default:return r("p",{},...ae(t.spans))}},wt=2500,Qe=t=>{let n=null,o=false,l=[],i=g=>n?g(n):l.push(g),s=new AbortController,u=g=>{var j,L;if(n||o)return;let D=Object.fromEntries(Object.entries(t).filter(([,x])=>x!==void 0));n=kt({...g!=null?g:{},...D,accent:(j=t.accent)!=null?j:g==null?void 0:g.accent,theme:(L=t.theme)!=null?L:g==null?void 0:g.theme});for(let x of l.splice(0))x(n);},h=setTimeout(()=>u(null),wt);return fe({host:t.host,apiKey:t.apiKey,distinctId:t.distinctId(),user:t.user()}).messengerLook(s.signal).then(g=>u(g)).catch(()=>u(null)).finally(()=>clearTimeout(h)),{open:g=>i(D=>D.open(g)),close:()=>n==null?void 0:n.close(),toggle:()=>i(g=>g.toggle()),destroy:()=>{o=true,s.abort(),clearTimeout(h),n==null||n.destroy();}}},kt=t=>{var Re,Oe,Ke,He,Pe,Fe,_e,qe;Ve();let n=(Re=t.position)!=null?Re:"bottom-right",o=t.title||"Chat with us",l=t.greeting||"Hi! How can we help?",i=(Oe=t.askEmail)!=null?Oe:true,s=(Ke=t.label)!=null?Ke:"",u=(He=t.launcher)!=null?He:true,h=(Pe=t.help)!=null?Pe:true,g=(Fe=t.sound)!=null?Fe:true,D=(_e=t.preview)!=null?_e:true,j=()=>fe({host:t.host,apiKey:t.apiKey,distinctId:t.distinctId(),user:t.user()}),L=r("div",{class:"ckw-root","data-theme":(qe=t.theme)!=null?qe:"auto"});t.accent&&L.style.setProperty("--ckw-accent",t.accent),document.body.appendChild(L);let x=false,m="home",w=null,be=false,H="",M=null,oe=null,b=[],W=false,G,R=null,v=null,A="",ie=new Set,ce=null,he=e=>{var a;return ((a=e==null?void 0:e.messages)!=null?a:[]).filter(c=>c.from!=="visitor")},ve=e=>{var a,c;return (c=(a=he(e).at(-1))==null?void 0:a.id)!=null?c:""},se=()=>x&&m==="messages"&&document.visibilityState!=="hidden",ye=e=>{let a=he(e);if(oe===null){let c=lt(),p=a.findIndex(d=>d.id===c);b=e.messages.some(d=>d.from==="visitor")?a.slice(p+1).filter(d=>d.from!=="auto"):[];}else {let c=a.findIndex(d=>d.id===oe),p=a.slice(c+1).filter(d=>d.from!=="auto");p.length&&(g&&ne.play(),se()||(b=[...b,...p],W=false));}oe=ve(e),w=e,se()&&pe();},pe=()=>{b=[];let e=ve(w);e&&dt(e);},O=r("button",{type:"button",class:`ckw-fab ckw-msgr-fab${s?"":" ckw-msgr-round"}`,"data-pos":n,"aria-haspopup":"dialog"}),Q=r("div",{class:"ckw-msgr-preview","data-pos":n,role:"status"}),U=()=>{O.replaceChildren(S(x?z.cross:z.chat,s?16:20)),s&&O.append(r("span",{},s)),b.length&&!x&&O.append(r("span",{class:"ckw-msgr-count","aria-hidden":"true"},String(Math.min(b.length,9)))),O.setAttribute("aria-expanded",String(x)),O.setAttribute("aria-label",x?"Close chat":b.length?`Open chat, ${b.length} new ${b.length===1?"reply":"replies"}`:"Open chat"),ze();},ze=()=>{let e=b.at(-1);if(!D||x||W||!e||!u)return Q.remove();let a=r("button",{type:"button",class:"ckw-msgr-preview-x","aria-label":"Dismiss"},S(z.cross,12));a.addEventListener("click",p=>{p.stopPropagation(),W=true,ze();});let c=r("button",{type:"button",class:"ckw-msgr-preview-card"},r("span",{class:"ckw-msgr-preview-who"},`${ue[e.from]}${b.length>1?` \xB7 ${b.length} new`:""}`),r("span",{class:"ckw-msgr-preview-text"},e.body));c.addEventListener("click",()=>te("messages")),Q.replaceChildren(c,a),Q.isConnected||L.appendChild(Q);};O.addEventListener("click",()=>{ne.unlock(),x?Y():te(b.length?"messages":"home");}),u&&L.appendChild(O);let K=r("div",{class:"ckw-pop ckw-msgr","data-pos":n,role:"dialog","aria-label":o}),B=r("div",{class:"ckw-pop-head ckw-msgr-head"}),y=r("div",{class:"ckw-pop-body ckw-msgr-body"}),Ce=r("nav",{class:"ckw-msgr-tabs","aria-label":"Messenger"});K.addEventListener("click",()=>ne.unlock());let V=r("form",{class:"ckw-msgr-compose"}),J=r("p",{class:"ckw-msgr-error",role:"alert"}),E=r("input",{class:"ckw-input",type:"email",inputmode:"email",autocomplete:"email",placeholder:"Your email (optional), so we can follow up","aria-label":"Your email (optional)",maxlength:"200"}),le=r("div",{class:"ckw-msgr-row"}),I=r("textarea",{class:"ckw-textarea ckw-msgr-input",rows:"1",placeholder:"Write a message\u2026","aria-label":"Message",maxlength:"4000"}),de=r("button",{type:"submit",class:"ckw-btn ckw-btn-primary ckw-msgr-send","aria-label":"Send"},S(z.send));le.append(I,de),V.append(le);let Se=r("ol",{class:"ckw-msgs","aria-live":"polite","aria-label":"Messages"}),Me=()=>{var e;return i&&!((e=t.user())!=null&&e.email)&&!(w!=null&&w.hasEmail)},ge=()=>!E.value.trim()||pt.test(E.value.trim()),Ae=()=>!!I.value.trim()&&!M&&ge(),X=()=>{let e=r("button",{type:"button",class:"ckw-btn ckw-btn-ghost ckw-msgr-x","aria-label":"Close messenger"},S(z.cross));return e.addEventListener("click",()=>Y()),e},T=e=>{m=e,ee=-1,P(),e==="messages"?(pe(),U(),I.focus()):e==="help"&&ke.focus(),q(0);},Ee=(e,a=false)=>{var p;let c=r("li",{class:"ckw-msg","data-from":e.from==="visitor"?"me":"them"},r("div",{class:"ckw-bubble"},e.body));a&&c.setAttribute("aria-busy","true");for(let d of (p=e.articles)!=null?p:[]){let k=r("button",{type:"button",class:"ckw-msgr-cite"},S(z.doc,14),r("span",{},d.title));k.addEventListener("click",()=>T({article:d.id})),c.append(k);}return c.append(r("span",{class:"ckw-msg-meta"},`${e.from!=="visitor"?`${ue[e.from]} \xB7 `:""}${a?"Sending\u2026":Ye(e.at)}`)),c},we=e=>{let a=r("button",{type:"button",class:"ckw-msgr-art"},r("span",{class:"ckw-msgr-art-t"},e.title),S(z.next,14));return a.addEventListener("click",()=>T({article:e.id})),a},Te=()=>{let e=r("label",{class:"ckw-msgr-search"},S(z.search,14)),a=r("input",{class:"ckw-msgr-search-in",type:"search",placeholder:"Search for help","aria-label":"Search for help",maxlength:"200"});a.value=A;let c;return a.addEventListener("input",()=>{A=a.value,clearTimeout(c),c=setTimeout(()=>{if(m!=="help")return T("help");me(true);},250);}),a.addEventListener("keydown",p=>{p.key==="Enter"&&(p.preventDefault(),m!=="help"&&T("help"));}),e.append(a),e},Z=Te(),ke=Z.querySelector("input"),xe=false,me=async(e=false)=>{if(!h||xe&&!e)return;xe=true;let a=A.trim();try{let c=await j().articles(a||void 0);if(a!==A.trim())return;v=c.articles,a||(ce=c.articles.length>0);}catch(c){v=v!=null?v:[];}finally{xe=false;}P();},Je=()=>{var d;B.replaceChildren(r("span",{class:"ckw-msgr-brand"},o),X());let e=r("div",{class:"ckw-msgr-hero"},r("p",{class:"ckw-msgr-hello"},l)),a=((d=w==null?void 0:w.messages)!=null?d:[]).at(-1),c=r("button",{type:"button",class:"ckw-msgr-card"},r("span",{class:"ckw-msgr-card-main"},r("b",{},a?"Recent message":"Send us a message"),r("span",{class:"ckw-msgr-card-sub"},a?`${a.from==="visitor"?"You":ue[a.from]}: ${a.body}`:"We usually answer within a few hours")),b.length?r("span",{class:"ckw-msgr-badge"},String(b.length)):S(z.send));c.addEventListener("click",()=>T("messages"));let p=[e,c];if(h&&ce!==false){let k=r("div",{class:"ckw-msgr-card ckw-msgr-card-col"},Te()),f=(v!=null?v:[]).slice(0,4);f.length?k.append(...f.map(we)):v===null&&k.append(r("div",{class:"ckw-skel ckw-msgr-skel"})),p.push(k);}y.replaceChildren(...p);},Xe=()=>{var a;B.replaceChildren(r("span",{},"Help"),X()),ke.value!==A&&(ke.value=A);let e=[Z];if(v===null)e.push(r("div",{class:"ckw-skel"}));else if(v.length)if(A.trim())e.push(r("div",{class:"ckw-msgr-card ckw-msgr-card-col"},...v.map(we)));else {let c=new Map;for(let p of v)c.set(p.collection,[...(a=c.get(p.collection))!=null?a:[],p]);for(let[p,d]of c)e.push(r("section",{class:"ckw-msgr-group"},r("h3",{class:"ckw-msgr-group-h"},`${p} \xB7 ${d.length}`),r("div",{class:"ckw-msgr-card ckw-msgr-card-col"},...d.map(we))));}else {let c=r("button",{type:"button",class:"ckw-btn ckw-btn-primary"},"Send us a message");c.addEventListener("click",()=>T("messages")),e.push(r("div",{class:"ckw-msgr-empty"},r("p",{},A.trim()?`Nothing found for \u201C${A.trim()}\u201D.`:"No help articles yet."),c));}for(y.firstChild!==Z&&y.replaceChildren(Z);y.childNodes.length>1;)y.lastChild.remove();y.append(...e.slice(1));},_=null,Ze=e=>{let a=r("button",{type:"button",class:"ckw-btn ckw-btn-ghost ckw-msgr-x","aria-label":"Back to help"},S(z.back));if(a.addEventListener("click",()=>T("help")),B.replaceChildren(a,r("span",{class:"ckw-msgr-head-t"},"Help"),X()),(_==null?void 0:_.id)===e)return y.replaceChildren(_.node);let c=r("article",{class:"ckw-msgr-doc"},r("div",{class:"ckw-skel"}));_={id:e,node:c},y.replaceChildren(c),j().article(e).then(p=>{let d=r("div",{class:"ckw-msgr-rate"}),k=()=>{if(ie.has(e))return d.replaceChildren(r("span",{},"Thanks for letting us know."));let F=r("button",{type:"button",class:"ckw-btn"},"Yes"),N=r("button",{type:"button",class:"ckw-btn"},"No"),Ne=De=>{ie=new Set(ie).add(e),k(),j().rateArticle(e,De).catch(()=>{}),De||T("messages");};F.addEventListener("click",()=>Ne(true)),N.addEventListener("click",()=>Ne(false)),d.replaceChildren(r("span",{},"Did this answer your question?"),r("span",{class:"ckw-msgr-rate-b"},F,N));};k();let f=r("button",{type:"button",class:"ckw-btn ckw-msgr-ask"},S(z.chat),"Still need help? Send us a message");f.addEventListener("click",()=>T("messages")),c.replaceChildren(r("p",{class:"ckw-msgr-doc-c"},p.collection),r("h2",{class:"ckw-msgr-doc-t"},p.title),r("p",{class:"ckw-msgr-doc-c"},`Updated ${Ye(p.updatedAt)}`),r("div",{class:"ckw-msgr-doc-b"},...p.blocks.map(gt)),d,f);}).catch(p=>{_=null,c.replaceChildren(r("p",{class:"ckw-msgr-error"},p.message));});},ee=-1,$e="",et=()=>{var p,d;B.replaceChildren(r("span",{},o),X());let e=(p=w==null?void 0:w.messages)!=null?p:[],a=[];if(!be)a.push(r("div",{class:"ckw-skel"}));else {let k=`${e.map(f=>f.id).join(",")}|${M?M.body:""}|${Math.floor(Date.now()/6e4)}`;if(k!==$e){$e=k;let f=r("li",{class:"ckw-msg","data-from":"them"},r("div",{class:"ckw-bubble"},l));Se.replaceChildren(f,...e.map(F=>Ee(F)),...M?[Ee(M,true)]:[]);}a.push(Se);}((d=w==null?void 0:w.conversation)==null?void 0:d.status)==="solved"&&!M&&a.push(r("p",{class:"ckw-fine ckw-msgr-note"},"This conversation is closed. Write to start a new one.")),(y.childNodes.length!==a.length||a.some((k,f)=>y.childNodes[f]!==k))&&y.replaceChildren(...a);let c=e.length+(M?1:0);c!==ee&&(ee=c,y.scrollTop=y.scrollHeight),J.textContent=H,H&&!J.isConnected?V.prepend(J):H||J.remove(),Me()?(ge()?E.removeAttribute("aria-invalid"):E.setAttribute("aria-invalid","true"),E.isConnected||V.insertBefore(E,le)):E.remove(),de.disabled=!Ae();},tt=()=>{let e=typeof m=="string"?m:"help",a=(c,p,d,k=0)=>{let f=r("button",{type:"button",class:"ckw-msgr-tab","aria-current":e===c?"page":"false"},S(d,18),r("span",{},p));return k&&f.append(r("span",{class:"ckw-msgr-count ckw-msgr-count-tab"},String(Math.min(k,9)))),f.addEventListener("click",()=>T(c)),f};Ce.replaceChildren(a("home","Home",z.home),a("messages","Messages",z.chat,m==="messages"?0:b.length),...h&&ce!==false?[a("help","Help",z.help)]:[]);},P=()=>{if(!x)return;K.dataset.view=typeof m=="string"?m:"article",m==="home"?Je():m==="messages"?et():m==="help"?Xe():Ze(m.article);let e=[B,y];m==="messages"&&e.push(V),e.push(Ce),tt(),(K.childNodes.length!==e.length||e.some((a,c)=>K.childNodes[c]!==a))&&K.replaceChildren(...e);},Le=async()=>{R==null||R.abort(),R=new AbortController;try{ye(await j().chat(R.signal)),H="";}catch(e){if(e.name==="AbortError")return;x&&m==="messages"&&(H=e.message);}be=true,P(),U(),q();};function q(e){var k,f,F;clearTimeout(G);let a=!!(w!=null&&w.messages.some(N=>N.from==="visitor"))&&((k=w==null?void 0:w.conversation)==null?void 0:k.status)!=="solved",c=(F=((f=w==null?void 0:w.messages)!=null?f:[]).filter(N=>N.from==="visitor").at(-1))==null?void 0:F.at,p=!!c&&Date.now()-new Date(c).getTime()<st,d=e!=null?e:se()?ot:a&&p?it:x||a?ct:0;(d||e===0)&&(G=setTimeout(()=>{Le();},d));}document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?q(0):clearTimeout(G);});let Ie=async()=>{let e=I.value.trim();if(!(!e||M||!ge())){ne.unlock(),M={id:"pending",from:"visitor",body:e,at:new Date().toISOString()},I.value="",H="",P();try{ye(await j().sendChat({body:e,email:Me()&&E.value.trim()?E.value.trim():void 0,url:window.location.href.slice(0,500)}));}catch(a){I.value=e,H=a.message;}M=null,P(),q();}};V.addEventListener("submit",e=>{e.preventDefault(),Ie();}),I.addEventListener("keydown",e=>{e.key==="Enter"&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),Ie());}),I.addEventListener("input",()=>de.disabled=!Ae()),E.addEventListener("input",()=>P());function te(e="home"){x=true,m=e==="help"&&!h?"home":e,ee=-1,W=true,K.isConnected||L.appendChild(K),(v===null||m==="help"&&A)&&me(),P(),U(),m==="messages"&&(pe(),I.focus()),q(0);}function Y(){x&&(x=false,K.remove(),U(),q(),u&&O.focus());}let je=e=>{e.key==="Escape"&&x&&Y();};return document.addEventListener("keydown",je),Le(),h&&me(),U(),{open:e=>te(e!=null?e:"home"),close:Y,toggle:()=>x?Y():te(),destroy:()=>{clearTimeout(G),R==null||R.abort(),document.removeEventListener("keydown",je),L.remove();}}};window.__mrrocketMessenger={mountMessenger:Qe};
|
|
347
|
+
`,et=()=>{if(typeof document=="undefined"||document.getElementById(Ze))return;let r=document.createElement("style");r.id=Ze,r.textContent=dt,document.head.appendChild(r);};var gt=4e3,wt=8e3,kt=3e4,xt=10*6e4,mt=/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/,rt="ckw_msgr_seen",ye={visitor:"You",team:"Team",ai:"AI agent",auto:"Team"},ft=()=>{var r;try{return (r=window.localStorage.getItem(rt))!=null?r:""}catch(a){return ""}},bt=r=>{try{window.localStorage.setItem(rt,r);}catch(a){}},ze=r=>{let a=new Date(r).getTime();if(Number.isNaN(a))return "";let n=Math.max(0,Date.now()-a)/1e3;return n<60?"just now":n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:n<86400*30?`${Math.floor(n/86400)}d ago`:new Date(r).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})},t=(r,a={},...n)=>{let p=document.createElement(r);for(let[i,s]of Object.entries(a))p.setAttribute(i,s);for(let i of n)i!==null&&i!==false&&i!==void 0&&p.append(i);return p},tt="http://www.w3.org/2000/svg",z=(r,a=16)=>{let n=document.createElementNS(tt,"svg");for(let[i,s]of Object.entries({class:"ckw-icon",width:String(a),height:String(a),viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"1.7","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"}))n.setAttribute(i,s);let p=document.createElementNS(tt,"path");return p.setAttribute("d",r),n.appendChild(p),n},h={cross:"m4 4 8 8M12 4l-8 8",chat:"M2.5 4.5a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v4.5a2 2 0 0 1-2 2H7l-3 2.5V11a2 2 0 0 1-1.5-2z",send:"M2.5 8h10M8.5 3.5 13 8l-4.5 4.5",up:"M8 13V3M3.5 7.5 8 3l4.5 4.5",home:"M2.5 7 8 2.5 13.5 7v6a1 1 0 0 1-1 1h-3v-4h-3v4h-3a1 1 0 0 1-1-1z",help:"M8 14.5A6.5 6.5 0 1 0 8 1.5a6.5 6.5 0 0 0 0 13zM6.2 6.2a1.9 1.9 0 1 1 2.6 1.8c-.5.2-.8.6-.8 1.1v.4M8 11.6v.1",back:"M10 3.5 5.5 8l4.5 4.5",next:"M6 3.5 10.5 8 6 12.5",search:"M7 11.5a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9zM10.5 10.5l3 3",doc:"M4 1.5h5.5l3 3V14a.5.5 0 0 1-.5.5H4a.5.5 0 0 1-.5-.5V2a.5.5 0 0 1 .5-.5zM9.5 1.5v3h3M6 8.5h4M6 11h4"},ie=(()=>{let r=null,a=()=>{var p;let n=(p=window.AudioContext)!=null?p:window.webkitAudioContext;return n?(r!=null||(r=new n),r):null};return {unlock:()=>{try{let n=a();(n==null?void 0:n.state)==="suspended"&&n.resume();}catch(n){}},play:()=>{try{let n=a();if(!n||n.state!=="running")return;let p=n.currentTime;[880,1318.5].forEach((i,s)=>{let x=n.createOscillator(),M=n.createGain(),g=p+s*.11;x.type="sine",x.frequency.value=i,M.gain.setValueAtTime(1e-4,g),M.gain.exponentialRampToValueAtTime(.12,g+.012),M.gain.exponentialRampToValueAtTime(1e-4,g+.32),x.connect(M),M.connect(n.destination),x.start(g),x.stop(g+.34);});}catch(n){}}}})(),ce=r=>r.map(a=>{let n=a.href?t("a",{href:a.href,target:"_blank",rel:"noopener noreferrer"},a.text):t("span",{},a.text);return a.code&&(n=t("code",{},n)),a.italic&&(n=t("em",{},n)),a.bold&&(n=t("strong",{},n)),n}),ut=r=>{switch(r.type){case "h2":case "h3":return t(r.type,{},...ce(r.spans));case "quote":return t("blockquote",{},...ce(r.spans));case "ul":case "ol":return t(r.type,{},...r.items.map(a=>t("li",{},...ce(a))));case "code":return t("pre",{},t("code",{},r.text));case "hr":return t("hr");default:return t("p",{},...ce(r.spans))}},ht=2500,at=r=>{let a=null,n=false,p=[],i=g=>a?g(a):p.push(g),s=new AbortController,x=g=>{var Y,G;if(a||n)return;let $=Object.fromEntries(Object.entries(r).filter(([,I])=>I!==void 0));a=vt({...g!=null?g:{},...$,accent:(Y=r.accent)!=null?Y:g==null?void 0:g.accent,theme:(G=r.theme)!=null?G:g==null?void 0:g.theme});for(let I of p.splice(0))I(a);},M=setTimeout(()=>x(null),ht);return ve({host:r.host,apiKey:r.apiKey,distinctId:r.distinctId(),user:r.user()}).messengerLook(s.signal).then(g=>x(g)).catch(()=>x(null)).finally(()=>clearTimeout(M)),{open:g=>i($=>$.open(g)),close:()=>a==null?void 0:a.close(),toggle:()=>i(g=>g.toggle()),destroy:()=>{n=true,s.abort(),clearTimeout(M),a==null||a.destroy();}}},vt=r=>{var Fe,_e,qe,Ne,De,Ue,Be,Ve,We;et();let a=(Fe=r.position)!=null?Fe:"bottom-right",n=r.title||"Chat with us",p=r.greeting||"Hi! How can we help?",i=(_e=r.askEmail)!=null?_e:true,s=(qe=r.label)!=null?qe:"",x=Je(r.replyTime),M=((Ne=n.trim()[0])!=null?Ne:"?").toUpperCase(),g=(De=r.launcher)!=null?De:true,$=(Ue=r.help)!=null?Ue:true,Y=(Be=r.sound)!=null?Be:true,G=(Ve=r.preview)!=null?Ve:true,I=()=>ve({host:r.host,apiKey:r.apiKey,distinctId:r.distinctId(),user:r.user()}),P=t("div",{class:"ckw-root","data-theme":(We=r.theme)!=null?We:"auto"});r.accent&&(P.style.setProperty("--ckw-accent",r.accent),P.style.setProperty("--ckw-accent-ink",Xe(r.accent))),document.body.appendChild(P);let b=false,m="home",w=null,Ce=false,H="",A=null,se=null,u=[],Q=false,J,O=null,v=null,E="",pe=new Set,le=null,Se=e=>{var o;return ((o=e==null?void 0:e.messages)!=null?o:[]).filter(c=>c.from!=="visitor")},Me=e=>{var o,c;return (c=(o=Se(e).at(-1))==null?void 0:o.id)!=null?c:""},de=()=>b&&m==="messages"&&document.visibilityState!=="hidden",Ae=e=>{let o=Se(e);if(se===null){let c=ft(),l=o.findIndex(d=>d.id===c);u=e.messages.some(d=>d.from==="visitor")?o.slice(l+1).filter(d=>d.from!=="auto"):[];}else {let c=o.findIndex(d=>d.id===se),l=o.slice(c+1).filter(d=>d.from!=="auto");l.length&&(Y&&ie.play(),de()||(u=[...u,...l],Q=false));}se=Me(e),w=e,de()&&ge();},ge=()=>{u=[];let e=Me(w);e&&bt(e);},X=e=>t("span",{class:`ckw-msgr-av${e?" ckw-msgr-av-sm":""}`,"aria-hidden":"true"},M),R=t("button",{type:"button",class:`ckw-fab ckw-msgr-fab${s?"":" ckw-msgr-round"}`,"data-pos":a,"aria-haspopup":"dialog"}),Z=t("div",{class:"ckw-msgr-preview","data-pos":a,role:"status"}),we=null,U=()=>{let e=z(b?h.cross:h.chat,s?18:24);we!==null&&we!==b&&e.classList.add("ckw-turn"),we=b,R.replaceChildren(e),s&&R.append(t("span",{},s)),u.length&&!b&&R.append(t("span",{class:"ckw-msgr-count","aria-hidden":"true"},String(Math.min(u.length,9)))),R.setAttribute("aria-expanded",String(b)),R.setAttribute("aria-label",b?"Close chat":u.length?`Open chat, ${u.length} new ${u.length===1?"reply":"replies"}`:"Open chat"),Ee();},Ee=()=>{let e=u.at(-1);if(!G||b||Q||!e||!g)return Z.remove();let o=t("button",{type:"button",class:"ckw-msgr-preview-x","aria-label":"Dismiss"},z(h.cross,12));o.addEventListener("click",l=>{l.stopPropagation(),Q=true,Ee();});let c=t("button",{type:"button",class:"ckw-msgr-preview-card"},X(),t("span",{class:"ckw-msgr-preview-main"},t("span",{class:"ckw-msgr-preview-who"},`${ye[e.from]}${u.length>1?` \xB7 ${u.length} new`:""}`),t("span",{class:"ckw-msgr-preview-text"},e.body)));c.addEventListener("click",()=>ne("messages")),Z.replaceChildren(c,o),Z.isConnected||P.appendChild(Z);};R.addEventListener("click",()=>{ie.unlock(),b?W():ne(u.length?"messages":"home");}),g&&P.appendChild(R);let K=t("div",{class:"ckw-pop ckw-msgr","data-pos":a,role:"dialog","aria-label":n}),B=t("div",{class:"ckw-pop-head ckw-msgr-head"}),y=t("div",{class:"ckw-pop-body ckw-msgr-body"}),Te=t("nav",{class:"ckw-msgr-tabs","aria-label":"Messenger"});K.addEventListener("click",()=>ie.unlock());let V=t("form",{class:"ckw-msgr-compose"}),ee=t("p",{class:"ckw-msgr-error",role:"alert"}),T=t("input",{class:"ckw-input",type:"email",inputmode:"email",autocomplete:"email",placeholder:"Your email (optional), so we can follow up","aria-label":"Your email (optional)",maxlength:"200"}),ke=t("div",{class:"ckw-msgr-row"}),j=t("textarea",{class:"ckw-textarea ckw-msgr-input",rows:"1",placeholder:"Write a message\u2026","aria-label":"Message",maxlength:"4000"}),xe=t("button",{type:"submit",class:"ckw-msgr-send","aria-label":"Send"},z(h.up));ke.append(j,xe),V.append(ke);let Le=t("ol",{class:"ckw-msgs","aria-live":"polite","aria-label":"Messages"}),$e=()=>{var e;return i&&!((e=r.user())!=null&&e.email)&&!(w!=null&&w.hasEmail)},me=()=>!T.value.trim()||mt.test(T.value.trim()),Ie=()=>!!j.value.trim()&&!A&&me(),te=()=>{let e=t("button",{type:"button",class:"ckw-btn ckw-btn-ghost ckw-msgr-x","aria-label":"Close messenger"},z(h.cross));return e.addEventListener("click",()=>W()),e},C=e=>{m=e,ae=-1,F(),e==="messages"?(ge(),U(),j.focus()):e==="help"&&be.focus(),N(0);},je=(e,o=false)=>{var l;let c=t("li",{class:"ckw-msg","data-from":e.from==="visitor"?"me":"them"},t("div",{class:"ckw-bubble"},e.body));o&&c.setAttribute("aria-busy","true");for(let d of (l=e.articles)!=null?l:[]){let k=t("button",{type:"button",class:"ckw-msgr-cite"},z(h.doc,14),t("span",{},d.title));k.addEventListener("click",()=>C({article:d.id})),c.append(k);}return c.append(t("span",{class:"ckw-msg-meta"},`${e.from!=="visitor"?`${ye[e.from]} \xB7 `:""}${o?"Sending\u2026":ze(e.at)}`)),c},fe=e=>{let o=t("button",{type:"button",class:"ckw-msgr-art"},t("span",{class:"ckw-msgr-art-t"},e.title),z(h.next,14));return o.addEventListener("click",()=>C({article:e.id})),o},Oe=()=>{let e=t("label",{class:"ckw-msgr-search"}),o=t("input",{class:"ckw-msgr-search-in",type:"search",placeholder:"Search for help","aria-label":"Search for help",maxlength:"200"});o.value=E;let c;return o.addEventListener("input",()=>{E=o.value,clearTimeout(c),c=setTimeout(()=>{if(m!=="help")return C("help");he(true);},250);}),o.addEventListener("keydown",l=>{l.key==="Enter"&&(l.preventDefault(),m!=="help"&&C("help"));}),e.append(o,z(h.search,16)),e},re=Oe(),be=re.querySelector("input"),ue=false,he=async(e=false)=>{if(!$||ue&&!e)return;ue=true;let o=E.trim();try{let c=await I().articles(o||void 0);if(o!==E.trim())return;v=c.articles,o||(le=c.articles.length>0);}catch(c){v=v!=null?v:[];}finally{ue=false;}F();},nt=()=>{var d;B.replaceChildren(t("span",{class:"ckw-msgr-brand"},X("sm"),t("span",{},n)),te());let e=t("div",{class:"ckw-msgr-hero"},t("p",{class:"ckw-msgr-hello"},p)),o=((d=w==null?void 0:w.messages)!=null?d:[]).at(-1),c=[e];if(o){let k=t("button",{type:"button",class:"ckw-msgr-card ckw-msgr-recent"},t("span",{class:"ckw-msgr-card-label"},"Recent message"),t("span",{class:"ckw-msgr-recent-row"},X(),t("span",{class:"ckw-msgr-card-main"},t("span",{class:"ckw-msgr-card-sub ckw-msgr-recent-text"},o.body),t("span",{class:"ckw-msgr-card-meta"},`${o.from==="visitor"?"You":ye[o.from]} \xB7 ${ze(o.at)}`)),u.length?t("span",{class:"ckw-msgr-badge"},String(u.length)):z(h.next,14)));k.addEventListener("click",()=>C("messages")),c.push(k);}let l=t("button",{type:"button",class:"ckw-msgr-card"},t("span",{class:"ckw-msgr-card-main"},t("b",{},"Send us a message"),t("span",{class:"ckw-msgr-card-sub"},x)),t("span",{class:"ckw-msgr-go"},z(h.send)));if(l.addEventListener("click",()=>C("messages")),c.push(l),$&&le!==false){let k=t("div",{class:"ckw-msgr-card ckw-msgr-card-col"},Oe()),f=(v!=null?v:[]).slice(0,4);f.length?k.append(...f.map(fe)):v===null&&k.append(t("div",{class:"ckw-skel ckw-msgr-skel"})),c.push(k);}y.replaceChildren(...c);},ot=()=>{var o;B.replaceChildren(t("span",{},"Help"),te()),be.value!==E&&(be.value=E);let e=[re];if(v===null)e.push(t("div",{class:"ckw-skel"}));else if(v.length)if(E.trim())e.push(t("div",{class:"ckw-msgr-card ckw-msgr-card-col"},...v.map(fe)));else {let c=new Map;for(let l of v)c.set(l.collection,[...(o=c.get(l.collection))!=null?o:[],l]);for(let[l,d]of c)e.push(t("section",{class:"ckw-msgr-group"},t("h3",{class:"ckw-msgr-group-h"},`${l} \xB7 ${d.length}`),t("div",{class:"ckw-msgr-card ckw-msgr-card-col"},...d.map(fe))));}else {let c=t("button",{type:"button",class:"ckw-btn ckw-btn-primary"},"Send us a message");c.addEventListener("click",()=>C("messages")),e.push(t("div",{class:"ckw-msgr-empty"},t("p",{},E.trim()?`Nothing found for \u201C${E.trim()}\u201D.`:"No help articles yet."),c));}for(y.firstChild!==re&&y.replaceChildren(re);y.childNodes.length>1;)y.lastChild.remove();y.append(...e.slice(1));},q=null,it=e=>{let o=t("button",{type:"button",class:"ckw-btn ckw-btn-ghost ckw-msgr-x","aria-label":"Back to help"},z(h.back));if(o.addEventListener("click",()=>C("help")),B.replaceChildren(o,t("span",{class:"ckw-msgr-head-t"},"Help"),te()),(q==null?void 0:q.id)===e)return y.replaceChildren(q.node);let c=t("article",{class:"ckw-msgr-doc"},t("div",{class:"ckw-skel"}));q={id:e,node:c},y.replaceChildren(c),I().article(e).then(l=>{let d=t("div",{class:"ckw-msgr-rate"}),k=()=>{if(pe.has(e))return d.replaceChildren(t("span",{},"Thanks for letting us know."));let _=t("button",{type:"button",class:"ckw-btn"},"Yes"),D=t("button",{type:"button",class:"ckw-btn"},"No"),Ye=Ge=>{pe=new Set(pe).add(e),k(),I().rateArticle(e,Ge).catch(()=>{}),Ge||C("messages");};_.addEventListener("click",()=>Ye(true)),D.addEventListener("click",()=>Ye(false)),d.replaceChildren(t("span",{},"Did this answer your question?"),t("span",{class:"ckw-msgr-rate-b"},_,D));};k();let f=t("button",{type:"button",class:"ckw-btn ckw-msgr-ask"},z(h.chat),"Still need help? Send us a message");f.addEventListener("click",()=>C("messages")),c.replaceChildren(t("p",{class:"ckw-msgr-doc-c"},l.collection),t("h2",{class:"ckw-msgr-doc-t"},l.title),t("p",{class:"ckw-msgr-doc-c"},`Updated ${ze(l.updatedAt)}`),t("div",{class:"ckw-msgr-doc-b"},...l.blocks.map(ut)),d,f);}).catch(l=>{q=null,c.replaceChildren(t("p",{class:"ckw-msgr-error"},l.message));});},ae=-1,Re="",ct=()=>{var l,d;B.replaceChildren(t("span",{class:"ckw-msgr-who"},X(),t("span",{class:"ckw-msgr-who-t"},t("b",{},n),t("span",{},x))),te());let e=(l=w==null?void 0:w.messages)!=null?l:[],o=[];if(!Ce)o.push(t("div",{class:"ckw-skel"}));else {let k=`${e.map(f=>f.id).join(",")}|${A?A.body:""}|${Math.floor(Date.now()/6e4)}`;if(k!==Re){Re=k;let f=t("li",{class:"ckw-msg","data-from":"them"},t("div",{class:"ckw-bubble"},p));Le.replaceChildren(f,...e.map(_=>je(_)),...A?[je(A,true)]:[]);}o.push(Le);}((d=w==null?void 0:w.conversation)==null?void 0:d.status)==="solved"&&!A&&o.push(t("p",{class:"ckw-fine ckw-msgr-note"},"This conversation is closed. Write to start a new one.")),(y.childNodes.length!==o.length||o.some((k,f)=>y.childNodes[f]!==k))&&y.replaceChildren(...o);let c=e.length+(A?1:0);c!==ae&&(ae=c,y.scrollTop=y.scrollHeight),ee.textContent=H,H&&!ee.isConnected?V.prepend(ee):H||ee.remove(),$e()?(me()?T.removeAttribute("aria-invalid"):T.setAttribute("aria-invalid","true"),T.isConnected||V.insertBefore(T,ke)):T.remove(),xe.disabled=!Ie();},st=()=>{let e=typeof m=="string"?m:"help",o=(c,l,d,k=0)=>{let f=t("button",{type:"button",class:"ckw-msgr-tab","aria-current":e===c?"page":"false"},z(d,18),t("span",{},l));return k&&f.append(t("span",{class:"ckw-msgr-count ckw-msgr-count-tab"},String(Math.min(k,9)))),f.addEventListener("click",()=>C(c)),f};Te.replaceChildren(o("home","Home",h.home),o("messages","Messages",h.chat,m==="messages"?0:u.length),...$&&le!==false?[o("help","Help",h.help)]:[]);},F=()=>{if(!b)return;K.dataset.view=typeof m=="string"?m:"article",m==="home"?nt():m==="messages"?ct():m==="help"?ot():it(m.article);let e=[B,y];m==="messages"&&e.push(V),e.push(Te),st(),(K.childNodes.length!==e.length||e.some((o,c)=>K.childNodes[c]!==o))&&K.replaceChildren(...e);},Ke=async()=>{O==null||O.abort(),O=new AbortController;try{Ae(await I().chat(O.signal)),H="";}catch(e){if(e.name==="AbortError")return;b&&m==="messages"&&(H=e.message);}Ce=true,F(),U(),N();};function N(e){var k,f,_;clearTimeout(J);let o=!!(w!=null&&w.messages.some(D=>D.from==="visitor"))&&((k=w==null?void 0:w.conversation)==null?void 0:k.status)!=="solved",c=(_=((f=w==null?void 0:w.messages)!=null?f:[]).filter(D=>D.from==="visitor").at(-1))==null?void 0:_.at,l=!!c&&Date.now()-new Date(c).getTime()<xt,d=e!=null?e:de()?gt:o&&l?wt:b||o?kt:0;(d||e===0)&&(J=setTimeout(()=>{Ke();},d));}document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?N(0):clearTimeout(J);});let Pe=async()=>{let e=j.value.trim();if(!(!e||A||!me())){ie.unlock(),A={id:"pending",from:"visitor",body:e,at:new Date().toISOString()},j.value="",H="",F();try{Ae(await I().sendChat({body:e,email:$e()&&T.value.trim()?T.value.trim():void 0,url:window.location.href.slice(0,500)}));}catch(o){j.value=e,H=o.message;}A=null,F(),N();}};V.addEventListener("submit",e=>{e.preventDefault(),Pe();}),j.addEventListener("keydown",e=>{e.key==="Enter"&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),Pe());}),j.addEventListener("input",()=>xe.disabled=!Ie()),T.addEventListener("input",()=>F());function ne(e="home"){b=true,m=e==="help"&&!$?"home":e,ae=-1,Q=true,K.isConnected||P.appendChild(K),(v===null||m==="help"&&E)&&he(),F(),U(),m==="messages"&&(ge(),j.focus()),N(0);}function W(){b&&(b=false,K.remove(),U(),N(),g&&R.focus());}let He=e=>{e.key==="Escape"&&b&&W();};return document.addEventListener("keydown",He),Ke(),$&&he(),U(),{open:e=>ne(e!=null?e:"home"),close:W,toggle:()=>b?W():ne(),destroy:()=>{clearTimeout(J),O==null||O.abort(),document.removeEventListener("keydown",He),P.remove();}}};window.__mrrocketMessenger={mountMessenger:at};
|
|
313
348
|
})();
|