@mrrocket/sdk 0.15.0 → 0.16.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 +10 -0
- package/README.md +36 -1
- package/dist/api-client.d.ts +5 -4
- package/dist/api-client.js +12 -8
- package/dist/api-client.js.map +1 -1
- package/dist/api.d.ts +4 -1
- package/dist/api.js +2 -1
- package/dist/api.js.map +1 -1
- package/dist/batch.d.ts +6 -4
- package/dist/batch.js +3 -3
- package/dist/batch.js.map +1 -1
- package/dist/browser/mrrocket-flows.js +2 -2
- package/dist/browser/mrrocket-forms.js +1 -1
- package/dist/browser/mrrocket-messenger.js +2 -2
- package/dist/browser/mrrocket-push.js +1 -1
- package/dist/browser/mrrocket-replay.js +3 -3
- package/dist/browser/mrrocket.js +1 -1
- package/dist/client.d.ts +10 -2
- package/dist/client.js +36 -15
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts +5 -1
- package/dist/context.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +1 -1
- package/dist/core.js.map +1 -1
- package/dist/errors.d.ts +5 -1
- package/dist/errors.js +8 -2
- package/dist/errors.js.map +1 -1
- package/dist/flows-web.d.ts +2 -0
- package/dist/flows-web.js +4 -1
- package/dist/flows-web.js.map +1 -1
- package/dist/flows.d.ts +10 -0
- package/dist/flows.js +2 -0
- package/dist/flows.js.map +1 -1
- package/dist/forms.d.ts +4 -0
- package/dist/forms.js +4 -1
- package/dist/forms.js.map +1 -1
- package/dist/identity.d.ts +42 -0
- package/dist/identity.js +24 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js.map +1 -1
- package/dist/messenger-ui.d.ts +2 -0
- package/dist/messenger-ui.js +2 -2
- package/dist/messenger-ui.js.map +1 -1
- package/dist/messenger.js +3 -2
- package/dist/messenger.js.map +1 -1
- package/dist/push-web.d.ts +2 -13
- package/dist/push-web.js +4 -2
- package/dist/push-web.js.map +1 -1
- package/dist/react-native/index.d.cts +61 -9
- package/dist/react-native/index.d.ts +61 -9
- package/dist/react-native/index.js +107 -28
- package/dist/react-native/index.js.map +1 -1
- package/dist/replay.d.ts +4 -1
- package/dist/replay.js +8 -2
- package/dist/replay.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/user-hash.d.ts +27 -0
- package/dist/user-hash.js +24 -0
- package/dist/user-hash.js.map +1 -0
- package/package.json +5 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { type ChangelogEntry, type ChatMessage, type ChatThread, type CockpitProviderProps, type CockpitUser, type FeedbackBoardInfo, type FeedbackBoardProps, type FeedbackComment, type FeedbackList, type FeedbackPost, type FeedbackRoadmap, type FeedbackWidgetProps, type MessengerProps, type PostStatus, type SurveyAnswer, type SurveyDefinition, type SurveyQuestion, type SurveyQuestionKind, CockpitProvider, Experiment, FeedbackBoard, FeedbackWidget, Messenger, Survey, Text, WIDGET_CSS, createApi, useCancelFlow, useCockpit, useFeedback, useFlag, useFlagVariant, useMessenger, usePaywall, usePush, useStyles, useVariant, } from "./browser.js";
|
|
2
2
|
export type { PushResult, PushStatus, WebPushOptions } from "./push-web.js";
|
|
3
|
+
/** `identify(id, props, { hash })` (0.16.0); the hash comes from `userHash()` in `@mrrocket/sdk/next/server`. */
|
|
4
|
+
export type { IdentifyOptions } from "./identity.js";
|
|
3
5
|
export { type CockpitConfig, type CockpitEvent, type ConsentChoice, type ConsentMode, type ReplayConfig, type ErrorReport, type ExperimentConfig, type FlagCondition, type FlagConditionSet, type FlagConfig, type FlagPerson, type RedirectConfig, type RedirectDecision, type VariantConfig, type VariantId, EMBED_PARAM, EXPOSURE_PARAM, SDK_VERSION, ID_COOKIE, PREVIEW_PARAM, SESSION_COOKIE, assign, evaluateFlag, parsePreview, previewHref, redirectFor, } from "./core.js";
|
|
4
6
|
export { type CancelFlowConfig, type CancelFlowOptions, type CancelFlowResult, type CancelOffer, type InAppMessage, type OnboardingFlow, type OnboardingStep, } from "./flows.js";
|
|
5
7
|
export type { FlowsTheme } from "./flows-ui.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n type ChangelogEntry,\n type ChatMessage,\n type ChatThread,\n type CockpitProviderProps,\n type CockpitUser,\n type FeedbackBoardInfo,\n type FeedbackBoardProps,\n type FeedbackComment,\n type FeedbackList,\n type FeedbackPost,\n type FeedbackRoadmap,\n type FeedbackWidgetProps,\n type MessengerProps,\n type PostStatus,\n type SurveyAnswer,\n type SurveyDefinition,\n type SurveyQuestion,\n type SurveyQuestionKind,\n CockpitProvider,\n Experiment,\n FeedbackBoard,\n FeedbackWidget,\n Messenger,\n Survey,\n Text,\n WIDGET_CSS,\n createApi,\n useCancelFlow,\n useCockpit,\n useFeedback,\n useFlag,\n useFlagVariant,\n useMessenger,\n usePaywall,\n usePush,\n useStyles,\n useVariant,\n} from \"./browser\";\nexport type { PushResult, PushStatus, WebPushOptions } from \"./push-web\";\nexport {\n type CockpitConfig,\n type CockpitEvent,\n type ConsentChoice,\n type ConsentMode,\n type ReplayConfig,\n type ErrorReport,\n type ExperimentConfig,\n type FlagCondition,\n type FlagConditionSet,\n type FlagConfig,\n type FlagPerson,\n type RedirectConfig,\n type RedirectDecision,\n type VariantConfig,\n type VariantId,\n EMBED_PARAM,\n EXPOSURE_PARAM,\n SDK_VERSION,\n ID_COOKIE,\n PREVIEW_PARAM,\n SESSION_COOKIE,\n assign,\n evaluateFlag,\n parsePreview,\n previewHref,\n redirectFor,\n} from \"./core\";\nexport {\n type CancelFlowConfig,\n type CancelFlowOptions,\n type CancelFlowResult,\n type CancelOffer,\n type InAppMessage,\n type OnboardingFlow,\n type OnboardingStep,\n} from \"./flows\";\nexport type { FlowsTheme } from \"./flows-ui\";\nexport { PAYWALL_EVENT, type PaywallConfig, type PaywallOptions, type PaywallPage, type PaywallPlan, type PaywallResult } from \"./paywall\";\nexport {\n type AttributionMode,\n type CheckoutReferral,\n type Referral,\n REFERRAL_COOKIE,\n getReferral,\n readReferralCookie,\n referralForCheckout,\n referralLink,\n} from \"./referral\";\n"],"mappings":";AAAA;AAAA,EAmBI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n type ChangelogEntry,\n type ChatMessage,\n type ChatThread,\n type CockpitProviderProps,\n type CockpitUser,\n type FeedbackBoardInfo,\n type FeedbackBoardProps,\n type FeedbackComment,\n type FeedbackList,\n type FeedbackPost,\n type FeedbackRoadmap,\n type FeedbackWidgetProps,\n type MessengerProps,\n type PostStatus,\n type SurveyAnswer,\n type SurveyDefinition,\n type SurveyQuestion,\n type SurveyQuestionKind,\n CockpitProvider,\n Experiment,\n FeedbackBoard,\n FeedbackWidget,\n Messenger,\n Survey,\n Text,\n WIDGET_CSS,\n createApi,\n useCancelFlow,\n useCockpit,\n useFeedback,\n useFlag,\n useFlagVariant,\n useMessenger,\n usePaywall,\n usePush,\n useStyles,\n useVariant,\n} from \"./browser\";\nexport type { PushResult, PushStatus, WebPushOptions } from \"./push-web\";\n/** `identify(id, props, { hash })` (0.16.0); the hash comes from `userHash()` in `@mrrocket/sdk/next/server`. */\nexport type { IdentifyOptions } from \"./identity\";\nexport {\n type CockpitConfig,\n type CockpitEvent,\n type ConsentChoice,\n type ConsentMode,\n type ReplayConfig,\n type ErrorReport,\n type ExperimentConfig,\n type FlagCondition,\n type FlagConditionSet,\n type FlagConfig,\n type FlagPerson,\n type RedirectConfig,\n type RedirectDecision,\n type VariantConfig,\n type VariantId,\n EMBED_PARAM,\n EXPOSURE_PARAM,\n SDK_VERSION,\n ID_COOKIE,\n PREVIEW_PARAM,\n SESSION_COOKIE,\n assign,\n evaluateFlag,\n parsePreview,\n previewHref,\n redirectFor,\n} from \"./core\";\nexport {\n type CancelFlowConfig,\n type CancelFlowOptions,\n type CancelFlowResult,\n type CancelOffer,\n type InAppMessage,\n type OnboardingFlow,\n type OnboardingStep,\n} from \"./flows\";\nexport type { FlowsTheme } from \"./flows-ui\";\nexport { PAYWALL_EVENT, type PaywallConfig, type PaywallOptions, type PaywallPage, type PaywallPlan, type PaywallResult } from \"./paywall\";\nexport {\n type AttributionMode,\n type CheckoutReferral,\n type Referral,\n REFERRAL_COOKIE,\n getReferral,\n readReferralCookie,\n referralForCheckout,\n referralLink,\n} from \"./referral\";\n"],"mappings":";AAAA;AAAA,EAmBI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAIP;AAAA,EAgBI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAWP,SAAS,qBAAsH;AAC/H;AAAA,EAII;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;","names":[]}
|
package/dist/messenger-ui.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface MessengerUiOptions {
|
|
|
23
23
|
name?: string;
|
|
24
24
|
email?: string;
|
|
25
25
|
} | undefined;
|
|
26
|
+
/** The identity hash of the visitor id now (0.16.0), when the site gave one to identify. */
|
|
27
|
+
userHash?: () => string | undefined;
|
|
26
28
|
/** Show the round launcher (default true). Without it the panel opens only through `open()`. */
|
|
27
29
|
launcher?: boolean;
|
|
28
30
|
/** Where the launcher sits (default bottom right); the panel and the cards open from there. */
|
package/dist/messenger-ui.js
CHANGED
|
@@ -180,7 +180,7 @@ var mountMessenger = (o) => {
|
|
|
180
180
|
for (const fn of queued.splice(0)) fn(real);
|
|
181
181
|
};
|
|
182
182
|
const timer = setTimeout(() => start(null), LOOK_WAIT_MS);
|
|
183
|
-
(o.client ?? createApi({ host: o.host, apiKey: o.apiKey, distinctId: o.distinctId(), user: o.user() })).messengerLook(ctrl.signal).then((look) => start(look)).catch(() => start(null)).finally(() => clearTimeout(timer));
|
|
183
|
+
(o.client ?? createApi({ host: o.host, apiKey: o.apiKey, distinctId: o.distinctId(), user: o.user(), userHash: o.userHash?.() })).messengerLook(ctrl.signal).then((look) => start(look)).catch(() => start(null)).finally(() => clearTimeout(timer));
|
|
184
184
|
return {
|
|
185
185
|
open: (v) => later((h) => h.open(v)),
|
|
186
186
|
close: () => real?.close(),
|
|
@@ -207,7 +207,7 @@ var build = (o) => {
|
|
|
207
207
|
const helpOn = o.help ?? true;
|
|
208
208
|
const soundOn = o.sound ?? true;
|
|
209
209
|
const previewOn = o.preview ?? true;
|
|
210
|
-
const api = () => o.client ?? createApi({ host: o.host, apiKey: o.apiKey, distinctId: o.distinctId(), user: o.user() });
|
|
210
|
+
const api = () => o.client ?? createApi({ host: o.host, apiKey: o.apiKey, distinctId: o.distinctId(), user: o.user(), userHash: o.userHash?.() });
|
|
211
211
|
const root = el("div", {
|
|
212
212
|
class: "ckw-root",
|
|
213
213
|
"data-theme": o.theme ?? "auto",
|
package/dist/messenger-ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/messenger-ui.ts"],"sourcesContent":["/**\n * The web messenger, after Crisp's: a round launcher (hovered, a small card offers \"Chat\" and \"Search\") and a panel\n * with a bar on top (Home, a \"Chat · Help\" switch while there are both, a ⋮ menu to minimize or widen it). Home shows the greeting,\n * the latest chat and the help search; Chat is the chat with the team, answered in MRRocket › Support by the owner or\n * the Customer experience agent; Help lists the product's published help articles by collection, searchable, read in\n * the panel. While the panel is closed it checks for answers now and then; a new answer plays a short sound, shows a\n * count on the launcher and a preview card above it. Opening, closing, switching and new messages move softly\n * (none of it with reduced motion).\n *\n * Plain DOM, no React, so `<Messenger />` (Next.js) and the script tag share it; both load it only when it is used (a\n * dynamic import, and `sdk-messenger.js` for the script tag). Every text is set with textContent; articles arrive as\n * blocks, never HTML.\n */\nimport {\n type Api,\n type ArticleBlock,\n type ArticleSpan,\n type ArticleSummary,\n BRAND_URL,\n CHAT_FILES_PER_MESSAGE,\n CHAT_FILE_MAX_BYTES,\n CHAT_FILE_TYPES,\n type ChatFile,\n type ChatMessage,\n type ChatThread,\n type MessengerCorners,\n type MessengerLook,\n type MessengerPosition,\n createApi,\n inkOn,\n replyLine,\n} from \"./api-client\";\nimport { injectStyles } from \"./styles-css\";\n\nexport interface MessengerUiOptions {\n host: string;\n apiKey: string;\n /** The visitor id now (it changes on identify and reset). */\n distinctId: () => string;\n /** The signed-in person's id, name and email, when the site called identify. */\n user: () => { id?: string; name?: string; email?: string } | undefined;\n /** Show the round launcher (default true). Without it the panel opens only through `open()`. */\n launcher?: boolean;\n /** Where the launcher sits (default bottom right); the panel and the cards open from there. */\n position?: MessengerPosition;\n /** The team's name beside its mark on Home. */\n title?: string;\n /** The big line on Home and the first line of an empty chat. */\n greeting?: string;\n /** Ask anonymous visitors for an email (optional for them). Default true. */\n askEmail?: boolean;\n /** Text on the launcher; empty shows the icon only. */\n label?: string;\n /** How soon the team usually answers, said under \"Send us a message\" and in the chat's head. */\n replyTime?: \"minutes\" | \"hours\" | \"day\";\n /** The Help tab with the product's published help articles (default true; hidden while there are none). */\n help?: boolean;\n /** A short sound when an answer arrives (default true). */\n sound?: boolean;\n /** A preview of a new answer above the closed launcher (default true). */\n preview?: boolean;\n theme?: \"light\" | \"dark\" | \"auto\";\n accent?: string;\n /** Up to two more colors blended with the accent in Home's background glow. */\n glow?: string[];\n /** How round panel, bubbles, cards and fields are (default round). */\n corners?: MessengerCorners;\n /** The site's own font (default) or the system's. */\n font?: \"site\" | \"system\";\n /** Home's top: plain (default) or in the accent color. */\n header?: \"plain\" | \"color\";\n /** \"Powered by MRRocket\" at the bottom; MRRocket's server says whether the plan may hide it. */\n branding?: boolean;\n /** The product's icon at the top left of Home (MRRocket sends the product's favicon); without it the title's first letter. */\n logo?: string;\n /** MRRocket's own preview: mount inside this element (positioned) instead of the page. */\n container?: HTMLElement;\n /** MRRocket's own preview: answers from here instead of the server. */\n client?: MessengerClient;\n /** MRRocket's own preview: start open on this view, without the opening motion. */\n opened?: MessengerView;\n}\n\n/** What the messenger asks the server (createApi's part it uses). */\nexport type MessengerClient = Pick<Api, \"chat\" | \"sendChat\" | \"uploadChatFile\" | \"attachmentUrl\" | \"articles\" | \"article\" | \"rateArticle\" | \"messengerLook\">;\n\nexport type MessengerView = \"home\" | \"messages\" | \"help\";\n\nexport interface MessengerHandle {\n /** Opens the panel, on Home or the given tab; `{ article }` opens a help article. */\n open(view?: MessengerView | { article: string }): void;\n close(): void;\n toggle(): void;\n /** Removes the launcher and the panel from the page. */\n destroy(): void;\n}\n\nconst POLL_OPEN_MS = 4000;\n/** While the panel is closed: soon after the visitor wrote, answers are looked for often, later now and then. */\nconst POLL_WAITING_MS = 8000;\nconst POLL_IDLE_MS = 30000;\nconst WAITING_FOR_MS = 10 * 60_000;\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\nconst SEEN_KEY = \"ckw_msgr_seen\";\nconst whoLabel: Record<ChatMessage[\"from\"], string> = { visitor: \"You\", team: \"Team\", ai: \"AI agent\", auto: \"Team\" };\n\nconst readSeen = () => {\n try {\n return window.localStorage.getItem(SEEN_KEY) ?? \"\";\n } catch {\n return \"\";\n }\n};\nconst writeSeen = (id: string) => {\n try {\n window.localStorage.setItem(SEEN_KEY, id);\n } catch {\n // Private mode: the count just shows again next time.\n }\n};\n\nconst timeAgo = (iso: string) => {\n const t = new Date(iso).getTime();\n if (Number.isNaN(t)) return \"\";\n const d = Math.max(0, Date.now() - t) / 1000;\n if (d < 60) return \"just now\";\n if (d < 3600) return `${Math.floor(d / 60)}m ago`;\n if (d < 86400) return `${Math.floor(d / 3600)}h ago`;\n if (d < 86400 * 30) return `${Math.floor(d / 86400)}d ago`;\n return new Date(iso).toLocaleDateString(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" });\n};\n\nconst el = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs: Record<string, string> = {}, ...kids: (Node | string | null | false | undefined)[]) => {\n const e = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v);\n for (const k of kids) if (k !== null && k !== false && k !== undefined) e.append(k);\n return e;\n};\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n/** A line icon on a 24-unit grid (Lucide's shapes, ISC). */\nconst icon = (d: string, size = 16) => {\n const svg = document.createElementNS(SVG_NS, \"svg\");\n for (const [k, v] of Object.entries({ class: \"ckw-icon\", width: String(size), height: String(size), viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", \"stroke-width\": \"1.75\", \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\", \"aria-hidden\": \"true\" }))\n svg.setAttribute(k, v);\n const path = document.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"d\", d);\n svg.appendChild(path);\n return svg;\n};\nconst I = {\n cross: \"M18 6 6 18M6 6l12 12\",\n chat: \"M7.9 20A9 9 0 1 0 4 16.1L2 22z\",\n send: \"M5 12h14M12 5l7 7-7 7\",\n up: \"M12 19V5M5 12l7-7 7 7\",\n home: \"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\",\n back: \"m15 18-6-6 6-6\",\n next: \"m9 18 6-6-6-6\",\n search: \"M19 11a8 8 0 1 1-16 0 8 8 0 0 1 16 0zM21 21l-4.3-4.3\",\n doc: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7zM14 2v4a2 2 0 0 0 2 2h4M10 9H8M16 13H8M16 17H8\",\n book: \"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\",\n dots: \"M13 12a1 1 0 1 1-2 0 1 1 0 0 1 2 0zM13 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0zM13 19a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\",\n expand: \"M15 3h6v6M21 3l-7 7M3 21l7-7M9 21H3v-6\",\n collapse: \"m14 10 7-7M20 10h-6V4M3 21l7-7M4 14h6v6\",\n minus: \"M5 12h14\",\n down: \"m6 9 6 6 6-6\",\n help: \"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20zM9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3M12 17h.01\",\n clip: \"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\",\n image: \"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zM9 11a2 2 0 1 0 0-4 2 2 0 0 0 0 4zM21 15l-3.09-3.09a2 2 0 0 0-2.82 0L6 21\",\n screen: \"M20 3H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zM8 21h8M12 17v4\",\n};\n\n/** A message's words for a one-line preview: its text, or what it sent. */\nconst lineOf = (m: ChatMessage) => m.body || (m.attachments?.length === 1 ? `Sent ${m.attachments[0].name}` : m.attachments?.length ? `Sent ${m.attachments.length} files` : \"\");\n\n/** The browser can grab a picture of this tab (not on phones, where people screenshot with the phone and attach it). */\nconst canShoot = () => typeof navigator !== \"undefined\" && typeof navigator.mediaDevices?.getDisplayMedia === \"function\";\n/** The launcher's filled bubble (24-unit grid). */\nconst BUBBLE = \"M7.9 20A9 9 0 1 0 4 16.1L2 22z\";\nconst filled = (d: string, size: number) => {\n const svg = document.createElementNS(SVG_NS, \"svg\");\n for (const [k, v] of Object.entries({ class: \"ckw-icon\", width: String(size), height: String(size), viewBox: \"0 0 24 24\", fill: \"currentColor\", stroke: \"currentColor\", \"stroke-width\": \"1.5\", \"stroke-linejoin\": \"round\", \"aria-hidden\": \"true\" }))\n svg.setAttribute(k, v);\n const path = document.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"d\", d);\n svg.appendChild(path);\n return svg;\n};\n\n/** A filled shape with lines cut into it in the ground's color (`.ckw-cut`): the current tab's icon, the launcher's bubble. */\nconst duo = (shape: string, cut: string, size: number, width = 2) => {\n const svg = filled(shape, size);\n const path = document.createElementNS(SVG_NS, \"path\");\n for (const [k, v] of Object.entries({ d: cut, class: \"ckw-cut\", fill: \"none\", \"stroke-width\": String(width), \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\" })) path.setAttribute(k, v);\n svg.appendChild(path);\n return svg;\n};\nconst DOTS = \"M8 12h.01M12 12h.01M16 12h.01\";\nconst HOUSE = \"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\";\nconst SMILE = \"M9.5 15.5c1.4 1 3.6 1 5 0\";\nconst DISC = \"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z\";\nconst QMARK = \"M9.4 9.2a2.7 2.7 0 0 1 5.2 1c0 1.8-2.6 2.5-2.6 2.5M12 16.8h.01\";\n\n/** A soft two-note chime made with Web Audio (no file to load). Browsers allow it once the visitor has clicked. */\nconst chime = (() => {\n let ctx: AudioContext | null = null;\n const get = () => {\n const AC = window.AudioContext ?? (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!AC) return null;\n ctx ??= new AC();\n return ctx;\n };\n return {\n /** Call from a click so later sounds may play. */\n unlock: () => {\n try {\n const c = get();\n if (c?.state === \"suspended\") void c.resume();\n } catch {\n // No audio: no sound.\n }\n },\n play: () => {\n try {\n const c = get();\n if (!c || c.state !== \"running\") return;\n const t = c.currentTime;\n [880, 1318.5].forEach((f, i) => {\n const o = c.createOscillator();\n const g = c.createGain();\n const at = t + i * 0.11;\n o.type = \"sine\";\n o.frequency.value = f;\n g.gain.setValueAtTime(0.0001, at);\n g.gain.exponentialRampToValueAtTime(0.12, at + 0.012);\n g.gain.exponentialRampToValueAtTime(0.0001, at + 0.32);\n o.connect(g);\n g.connect(c.destination);\n o.start(at);\n o.stop(at + 0.34);\n });\n } catch {\n // No audio: no sound.\n }\n },\n };\n})();\n\nconst spansOf = (spans: ArticleSpan[]) =>\n spans.map((s) => {\n let node: HTMLElement = s.href ? el(\"a\", { href: s.href, target: \"_blank\", rel: \"noopener noreferrer\" }, s.text) : el(\"span\", {}, s.text);\n if (s.code) node = el(\"code\", {}, node);\n if (s.italic) node = el(\"em\", {}, node);\n if (s.bold) node = el(\"strong\", {}, node);\n return node;\n });\n\nconst blockOf = (b: ArticleBlock): HTMLElement => {\n switch (b.type) {\n case \"h2\":\n case \"h3\":\n return el(b.type, {}, ...spansOf(b.spans));\n case \"quote\":\n return el(\"blockquote\", {}, ...spansOf(b.spans));\n case \"ul\":\n case \"ol\":\n return el(b.type, {}, ...b.items.map((it) => el(\"li\", {}, ...spansOf(it))));\n case \"code\":\n return el(\"pre\", {}, el(\"code\", {}, b.text));\n case \"hr\":\n return el(\"hr\");\n default:\n return el(\"p\", {}, ...spansOf(b.spans));\n }\n};\n\n/** How long the launcher waits for the look from MRRocket before it shows with the code's options and the defaults. */\nconst LOOK_WAIT_MS = 2500;\n\n/**\n * Mounts the messenger with its look from MRRocket (Support › Messenger) underneath what the code passes: an option the\n * code sets wins, one it leaves out comes from MRRocket, then the default. Calls made before the look arrived wait.\n */\nexport const mountMessenger = (o: MessengerUiOptions): MessengerHandle => {\n let real: MessengerHandle | null = null;\n let gone = false;\n const queued: ((h: MessengerHandle) => void)[] = [];\n const later = (fn: (h: MessengerHandle) => void) => (real ? fn(real) : queued.push(fn));\n const ctrl = new AbortController();\n const start = (look: Partial<MessengerLook> | null) => {\n if (real || gone) return;\n const defined = Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined)) as MessengerUiOptions;\n // The branding comes from the server alone: what the plan allows is not the site's code to decide.\n real = build({ ...(look ?? {}), ...defined, accent: o.accent ?? look?.accent, theme: o.theme ?? look?.theme, branding: look?.branding ?? true });\n for (const fn of queued.splice(0)) fn(real);\n };\n const timer = setTimeout(() => start(null), LOOK_WAIT_MS);\n (o.client ?? createApi({ host: o.host, apiKey: o.apiKey, distinctId: o.distinctId(), user: o.user() }))\n .messengerLook(ctrl.signal)\n .then((look) => start(look))\n .catch(() => start(null))\n .finally(() => clearTimeout(timer));\n return {\n open: (v) => later((h) => h.open(v)),\n close: () => real?.close(),\n toggle: () => later((h) => h.toggle()),\n destroy: () => {\n gone = true;\n ctrl.abort();\n clearTimeout(timer);\n real?.destroy();\n },\n };\n};\n\nconst PLACES: MessengerPosition[] = [\"top-left\", \"top-center\", \"top-right\", \"middle-left\", \"middle-right\", \"bottom-left\", \"bottom-center\", \"bottom-right\"];\n\nconst build = (o: MessengerUiOptions): MessengerHandle => {\n injectStyles();\n // A script tag's attribute can say anything: an unknown place, corner or top is the default.\n const position = PLACES.find((p) => p === o.position) ?? \"bottom-right\";\n const title = o.title || \"Support\";\n const greeting = o.greeting || \"Hi! How can we help?\";\n const askEmail = o.askEmail ?? true;\n const label = o.label ?? \"\";\n const reply = replyLine(o.replyTime);\n /** The team's mark: the first letter of the title, on the accent. */\n const initial = (title.trim()[0] ?? \"?\").toUpperCase();\n const launcherOn = o.launcher ?? true;\n const helpOn = o.help ?? true;\n const soundOn = o.sound ?? true;\n const previewOn = o.preview ?? true;\n const api = (): MessengerClient => o.client ?? createApi({ host: o.host, apiKey: o.apiKey, distinctId: o.distinctId(), user: o.user() });\n\n const root = el(\"div\", {\n class: \"ckw-root\",\n \"data-theme\": o.theme ?? \"auto\",\n \"data-corners\": o.corners === \"soft\" || o.corners === \"square\" ? o.corners : \"round\",\n \"data-font\": o.font === \"system\" ? \"system\" : \"site\",\n \"data-header\": o.header === \"color\" ? \"color\" : \"plain\",\n });\n if (o.container) root.setAttribute(\"data-contained\", \"\");\n if (o.accent) {\n root.style.setProperty(\"--ckw-accent\", o.accent);\n root.style.setProperty(\"--ckw-accent-ink\", inkOn(o.accent));\n }\n o.glow?.slice(0, 2).forEach((c, i) => /^#[0-9a-f]{6}$/i.test(c) && root.style.setProperty(`--ckw-glow${i + 2}`, c));\n (o.container ?? document.body).appendChild(root);\n\n let open = false;\n let view: MessengerView | { article: string } = \"home\";\n let thread: ChatThread | null = null;\n let loaded = false;\n let error = \"\";\n let pending: ChatMessage | null = null;\n /** The newest team message seen in this page load: what counts as new after it. */\n let lastKnown: string | null = null;\n let unseen: ChatMessage[] = [];\n let previewGone = false;\n let poll: ReturnType<typeof setTimeout> | undefined;\n let ctrl: AbortController | null = null;\n let articles: ArticleSummary[] | null = null;\n let query = \"\";\n let rated = new Set<string>();\n /** Whether the product has any published article: the Help tab and Home's help card hide when it has none. */\n let hasArticles: boolean | null = null;\n /** The help collection opened from Help's list (null: the list of collections). */\n let collection: string | null = null;\n /** The panel widened from the ⋮ menu. */\n let wide = false;\n\n const teamMsgs = (t: ChatThread | null) => (t?.messages ?? []).filter((m) => m.from !== \"visitor\");\n const lastTeamId = (t: ChatThread | null) => teamMsgs(t).at(-1)?.id ?? \"\";\n const watching = () => open && view === \"messages\" && document.visibilityState !== \"hidden\";\n\n /** Takes a thread from the server: new answers count, chime and show in the preview. */\n const take = (t: ChatThread) => {\n const team = teamMsgs(t);\n if (lastKnown === null) {\n // First read: answers the visitor never saw in an earlier visit count, without a sound.\n const seen = readSeen();\n const i = team.findIndex((m) => m.id === seen);\n unseen = t.messages.some((m) => m.from === \"visitor\") ? team.slice(i + 1).filter((m) => m.from !== \"auto\") : [];\n } else {\n const i = team.findIndex((m) => m.id === lastKnown);\n const fresh = team.slice(i + 1).filter((m) => m.from !== \"auto\");\n if (fresh.length) {\n if (soundOn) chime.play();\n if (!watching()) {\n unseen = [...unseen, ...fresh];\n previewGone = false;\n }\n }\n }\n lastKnown = lastTeamId(t);\n thread = t;\n if (watching()) markSeen();\n };\n const markSeen = () => {\n unseen = [];\n const id = lastTeamId(thread);\n if (id) writeSeen(id);\n };\n\n const avatar = (size?: \"sm\") => el(\"span\", { class: `ckw-msgr-av${size ? \" ckw-msgr-av-sm\" : \"\"}`, \"aria-hidden\": \"true\" }, initial);\n /** Home's top left: the product's icon, or its first letter when it has none (or the icon fails to load). */\n const logo = el(\"span\", { class: \"ckw-msgr-logo\", \"aria-hidden\": \"true\" });\n if (o.logo) {\n const img = el(\"img\", { src: o.logo, alt: \"\" });\n img.addEventListener(\"error\", () => logo.replaceChildren(avatar(\"sm\")));\n logo.append(img);\n } else logo.append(avatar(\"sm\"));\n /** Home's background: a soft silk of the accent with a field of dots drifting through it, top right. */\n const sky = el(\"div\", { class: \"ckw-msgr-sky\", \"aria-hidden\": \"true\" });\n\n // ---------- Coming and going ----------\n /** Pending removals: a node that leaves plays its way out first (data-out), unless it is shown again meanwhile. */\n const leaving = new Map<HTMLElement, ReturnType<typeof setTimeout>>();\n const enter = (node: HTMLElement, parent: HTMLElement = root) => {\n clearTimeout(leaving.get(node));\n leaving.delete(node);\n node.removeAttribute(\"data-out\");\n if (!node.isConnected) parent.appendChild(node);\n };\n const leave = (node: HTMLElement, ms = 180) => {\n if (!node.isConnected || leaving.has(node)) return;\n node.setAttribute(\"data-out\", \"\");\n leaving.set(\n node,\n setTimeout(() => {\n leaving.delete(node);\n node.removeAttribute(\"data-out\");\n node.remove();\n }, ms),\n );\n };\n /** Plays an entrance again on a node that stays (a new view in the same body). */\n const replay = (node: HTMLElement, cls: string) => {\n node.classList.remove(cls);\n void node.offsetWidth;\n node.classList.add(cls);\n };\n\n // ---------- Launcher, teaser and preview ----------\n const fab = el(\"button\", { type: \"button\", class: `ckw-fab ckw-msgr-fab${label ? \"\" : \" ckw-msgr-round\"}`, \"data-pos\": position, \"aria-haspopup\": \"dialog\" });\n const fabIcons = el(\n \"span\",\n { class: \"ckw-msgr-fab-ic\", \"aria-hidden\": \"true\" },\n el(\"span\", { class: \"ckw-msgr-fab-i\", \"data-i\": \"chat\" }, duo(BUBBLE, DOTS, label ? 20 : 27, 2.6)),\n el(\"span\", { class: \"ckw-msgr-fab-i\", \"data-i\": \"x\" }, icon(I.down, label ? 18 : 24)),\n );\n const fabCount = el(\"span\", { class: \"ckw-msgr-count\", \"aria-hidden\": \"true\" });\n fab.append(fabIcons);\n if (label) fab.append(el(\"span\", {}, label));\n const prev = el(\"div\", { class: \"ckw-msgr-preview\", \"data-pos\": position, role: \"status\" });\n const drawFab = () => {\n fab.toggleAttribute(\"data-open\", open);\n if (unseen.length && !open) {\n const n = String(Math.min(unseen.length, 9));\n if (fabCount.textContent !== n) fabCount.textContent = n;\n if (!fabCount.isConnected) fab.append(fabCount);\n } else fabCount.remove();\n fab.setAttribute(\"aria-expanded\", String(open));\n fab.setAttribute(\"aria-label\", open ? \"Close chat\" : unseen.length ? `Open chat, ${unseen.length} new ${unseen.length === 1 ? \"reply\" : \"replies\"}` : \"Open chat\");\n drawPreview();\n };\n const previewShown = () => previewOn && !open && !previewGone && !!unseen.length && launcherOn;\n const drawPreview = () => {\n const m = unseen.at(-1);\n if (!previewShown() || !m) return leave(prev);\n hideTeaser(true);\n const x = el(\"button\", { type: \"button\", class: \"ckw-msgr-preview-x\", \"aria-label\": \"Dismiss\" }, icon(I.cross, 14));\n x.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n previewGone = true;\n drawPreview();\n });\n const card = el(\n \"button\",\n { type: \"button\", class: \"ckw-msgr-preview-card\" },\n el(\n \"span\",\n { class: \"ckw-msgr-preview-main\" },\n el(\"span\", { class: \"ckw-msgr-preview-who\" }, `${whoLabel[m.from]}${unseen.length > 1 ? ` · ${unseen.length} new` : \"\"}`),\n el(\"span\", { class: \"ckw-msgr-preview-text\" }, lineOf(m)),\n ),\n );\n card.addEventListener(\"click\", () => show(\"messages\"));\n prev.replaceChildren(card, x);\n enter(prev);\n };\n\n /** Hovering the closed launcher: a small card with the greeting, the reply time, \"Chat\" and \"Search\". */\n const teaser = el(\"div\", { class: \"ckw-msgr-teaser\", \"data-pos\": position });\n let teaserTimer: ReturnType<typeof setTimeout> | undefined;\n const showTeaser = () => {\n clearTimeout(teaserTimer);\n if (open || previewShown() || !launcherOn) return;\n const chat = el(\"button\", { type: \"button\", class: \"ckw-msgr-teaser-b\", \"data-main\": \"\" }, icon(I.chat), el(\"span\", {}, \"Chat\"));\n chat.addEventListener(\"click\", () => show(\"messages\"));\n const buttons: HTMLElement[] = [chat];\n if (helpOn && hasArticles) {\n const search = el(\"button\", { type: \"button\", class: \"ckw-msgr-teaser-b\" }, icon(I.search), el(\"span\", {}, \"Search\"));\n search.addEventListener(\"click\", () => show(\"help\"));\n buttons.push(search);\n }\n teaser.replaceChildren(\n el(\n \"div\",\n { class: \"ckw-msgr-teaser-top\" },\n el(\"span\", { class: \"ckw-msgr-teaser-t\" }, el(\"b\", {}, greeting), el(\"span\", { class: \"ckw-msgr-online\" }, reply)),\n avatar(),\n ),\n el(\"div\", { class: \"ckw-msgr-teaser-row\" }, ...buttons),\n );\n enter(teaser);\n };\n function hideTeaser(now = false) {\n clearTimeout(teaserTimer);\n if (now) return leave(teaser, 140);\n teaserTimer = setTimeout(() => leave(teaser, 140), 260);\n }\n const hoverable = (e: PointerEvent) => e.pointerType === \"mouse\";\n for (const node of [fab, teaser] as HTMLElement[]) {\n node.addEventListener(\"pointerenter\", (e) => hoverable(e) && (node === fab ? showTeaser() : clearTimeout(teaserTimer)));\n node.addEventListener(\"pointerleave\", (e) => hoverable(e) && hideTeaser());\n }\n\n fab.addEventListener(\"click\", () => {\n chime.unlock();\n hideTeaser(true);\n if (open) close();\n else show(unseen.length ? \"messages\" : \"home\");\n });\n if (launcherOn) root.appendChild(fab);\n\n // ---------- Panel ----------\n const pop = el(\"div\", { class: \"ckw-pop ckw-msgr\", \"data-pos\": position, role: \"dialog\", \"aria-label\": title });\n const bar = el(\"div\", { class: \"ckw-msgr-bar\" });\n const body = el(\"div\", { class: \"ckw-pop-body ckw-msgr-body\" });\n pop.addEventListener(\"click\", () => chime.unlock());\n\n // The bar keeps its elements between draws; its middle says where the visitor is (the team in a chat, Help).\n const lead = el(\"span\", { class: \"ckw-msgr-lead\" });\n const mid = el(\"span\", { class: \"ckw-msgr-mid\" });\n // Home · Messages · Help along the foot like an app's tab bar (the open chat has its composer there instead):\n // a line icon, filled while its tab is the current one.\n const tabs = el(\"nav\", { class: \"ckw-msgr-tabs\", \"aria-label\": \"Messenger\" });\n const tab = (v: MessengerView, name: string, line: string, shape: string, cut: string) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-tab\" }, el(\"span\", { class: \"ckw-msgr-tab-ic\" }, icon(line, 22), duo(shape, cut, 22)), el(\"span\", {}, name));\n b.addEventListener(\"click\", () => {\n collection = null;\n go(v);\n });\n return b;\n };\n const homeTab = tab(\"home\", \"Home\", I.home, HOUSE, SMILE);\n const chatTab = tab(\"messages\", \"Messages\", I.chat, BUBBLE, DOTS);\n const helpTab = tab(\"help\", \"Help\", I.help, DISC, QMARK);\n const tabCount = el(\"span\", { class: \"ckw-msgr-count ckw-msgr-count-tab\", \"aria-hidden\": \"true\" });\n const menuBtn = el(\"button\", { type: \"button\", class: \"ckw-msgr-ib\", \"aria-label\": \"More\", \"aria-haspopup\": \"menu\", \"aria-expanded\": \"false\" }, icon(I.dots, 18));\n /** On a phone the panel covers the launcher, so it has its own close. */\n const xBtn = el(\"button\", { type: \"button\", class: \"ckw-msgr-ib ckw-msgr-x\", \"aria-label\": \"Close messenger\" }, icon(I.cross));\n xBtn.addEventListener(\"click\", () => close());\n bar.append(lead, mid, el(\"span\", { class: \"ckw-msgr-trail\" }, menuBtn, xBtn));\n\n const menu = el(\"div\", { class: \"ckw-msgr-menu\", role: \"menu\" });\n const menuOpen = () => menu.isConnected && !menu.hasAttribute(\"data-out\");\n const closeMenu = () => {\n menuBtn.setAttribute(\"aria-expanded\", \"false\");\n leave(menu, 120);\n };\n const menuItem = (d: string, name: string, act: () => void) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-menu-i\", role: \"menuitem\" }, icon(d, 15), el(\"span\", {}, name));\n b.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n closeMenu();\n act();\n });\n return b;\n };\n menuBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (menuOpen()) return closeMenu();\n menu.replaceChildren(\n el(\"span\", { class: \"ckw-msgr-menu-h\" }, \"Quick actions\"),\n menuItem(I.minus, \"Minimize chat\", () => close()),\n menuItem(wide ? I.collapse : I.expand, wide ? \"Collapse view\" : \"Expand view\", () => {\n wide = !wide;\n pop.toggleAttribute(\"data-wide\", wide);\n }),\n );\n menuBtn.setAttribute(\"aria-expanded\", \"true\");\n enter(menu, pop);\n (menu.querySelector(\"button\") as HTMLButtonElement | null)?.focus();\n });\n pop.addEventListener(\"click\", () => menuOpen() && closeMenu());\n\n const drawBar = () => {\n const back = (to: () => void, name: string) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-ib\", \"aria-label\": name }, icon(I.back, 18));\n b.addEventListener(\"click\", to);\n return b;\n };\n if (typeof view !== \"string\")\n lead.replaceChildren(\n back(() => go(\"help\"), \"Back to help\"),\n );\n else if (view === \"help\" && collection && !query.trim())\n lead.replaceChildren(\n back(() => {\n collection = null;\n go(\"help\");\n }, \"All collections\"),\n );\n else if (view === \"messages\") lead.replaceChildren(back(() => go(\"home\"), \"Back to home\"));\n else if (view === \"home\") lead.replaceChildren(logo);\n else lead.replaceChildren();\n if (view === \"messages\") mid.replaceChildren(avatar(\"sm\"), el(\"span\", { class: \"ckw-msgr-mid-t\" }, el(\"b\", {}, title), el(\"span\", { class: \"ckw-msgr-online\" }, reply)));\n else if (view === \"help\") mid.replaceChildren(el(\"b\", {}, \"Help\"));\n else mid.replaceChildren();\n // Without published articles there is no Help tab: Home and Messages.\n const items = helpOn && hasArticles !== false ? [homeTab, chatTab, helpTab] : [homeTab, chatTab];\n if (tabs.childNodes.length !== items.length) tabs.replaceChildren(...items);\n homeTab.setAttribute(\"aria-current\", view === \"home\" ? \"page\" : \"false\");\n chatTab.setAttribute(\"aria-current\", view === \"messages\" ? \"page\" : \"false\");\n helpTab.setAttribute(\"aria-current\", view !== \"home\" && view !== \"messages\" ? \"page\" : \"false\");\n if (unseen.length && view !== \"messages\") {\n tabCount.textContent = String(Math.min(unseen.length, 9));\n if (!tabCount.isConnected) chatTab.firstChild!.appendChild(tabCount);\n } else tabCount.remove();\n };\n\n // The chat's compose form keeps its elements between draws, so the field never loses the focus.\n const form = el(\"form\", { class: \"ckw-msgr-compose\" });\n const err = el(\"p\", { class: \"ckw-msgr-error\", role: \"alert\" });\n const email = el(\"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\" });\n const row = el(\"div\", { class: \"ckw-msgr-box\" });\n const text = el(\"textarea\", { class: \"ckw-textarea ckw-msgr-input\", rows: \"1\", placeholder: \"Write your message…\", \"aria-label\": \"Message\", maxlength: \"4000\" });\n const send = el(\"button\", { type: \"submit\", class: \"ckw-msgr-send\", \"aria-label\": \"Send\" }, icon(I.up));\n // Files for the next message (screenshots, photos, a PDF): picked with the paperclip, pasted or dropped onto the\n // panel. Each uploads the moment it is picked; Send waits for the uploads.\n const shots = canShoot();\n const clip = el(\n \"button\",\n { type: \"button\", class: \"ckw-msgr-clip\", \"aria-label\": shots ? \"Attach a file or a screenshot\" : \"Attach a file\", ...(shots ? { \"aria-haspopup\": \"menu\", \"aria-expanded\": \"false\" } : {}) },\n icon(I.clip, 18),\n );\n row.append(text, el(\"div\", { class: \"ckw-msgr-tools\" }, clip, el(\"span\", { class: \"ckw-msgr-sp\" }), send));\n row.addEventListener(\"click\", (e) => e.target === row && text.focus());\n form.append(row);\n const picker = el(\"input\", { type: \"file\", accept: CHAT_FILE_TYPES.join(\",\"), multiple: \"\", hidden: \"\", tabindex: \"-1\", \"aria-hidden\": \"true\" });\n form.append(picker);\n const tray = el(\"div\", { class: \"ckw-msgr-files\", role: \"list\", \"aria-label\": \"Files to send\" });\n\n interface Picked {\n key: string;\n name: string;\n type: ChatFile[\"type\"];\n size: number;\n /** The picture on this device, shown until the server has it. */\n local: string;\n /** The upload id once the upload finished. */\n id?: string;\n up: Promise<void>;\n ctrl: AbortController;\n }\n let picked: Picked[] = [];\n /** Pictures of the message on its way, by their local key. */\n const localUrls = new Map<string, string>();\n const fileUrl = (id: string) => localUrls.get(id) ?? api().attachmentUrl(id);\n const forget = (p: Picked) => {\n p.ctrl.abort();\n if (![...localUrls.values()].includes(p.local)) URL.revokeObjectURL(p.local);\n };\n const dropFile = (p: Picked) => {\n picked = picked.filter((x) => x !== p);\n forget(p);\n };\n const addFiles = (list: (Blob & { name?: string })[]) => {\n error = \"\";\n for (const f of list) {\n const name = f.name || \"screenshot.png\";\n if (picked.length >= CHAT_FILES_PER_MESSAGE) {\n error = `Up to ${CHAT_FILES_PER_MESSAGE} files per message.`;\n break;\n }\n if (!(CHAT_FILE_TYPES as readonly string[]).includes(f.type)) {\n error = \"Only pictures (PNG, JPEG, WebP, GIF) and PDFs can be sent.\";\n continue;\n }\n if (f.size > CHAT_FILE_MAX_BYTES) {\n error = `${name} is larger than 10 MB.`;\n continue;\n }\n const p: Picked = { key: `local-${Date.now().toString(36)}${Math.random().toString(36).slice(2, 7)}`, name, type: f.type as ChatFile[\"type\"], size: f.size, local: URL.createObjectURL(f), up: Promise.resolve(), ctrl: new AbortController() };\n p.up = api()\n .uploadChatFile(f, p.ctrl.signal)\n .then(\n (r) => {\n p.id = r.id;\n draw();\n },\n (e: Error) => {\n if (e.name === \"AbortError\") return;\n dropFile(p);\n error = `${p.name}: ${e.message}`;\n draw();\n },\n );\n picked.push(p);\n }\n if (open && view !== \"messages\") go(\"messages\");\n else draw();\n text.focus();\n };\n let traySig = \"\";\n const drawTray = () => {\n const sig = picked.map((p) => `${p.key}:${p.id ? 1 : 0}`).join(\",\");\n if (sig !== traySig) {\n traySig = sig;\n tray.replaceChildren(\n ...picked.map((p) => {\n const x = el(\"button\", { type: \"button\", class: \"ckw-msgr-file-x\", \"aria-label\": `Remove ${p.name}` }, icon(I.cross, 12));\n x.addEventListener(\"click\", () => {\n dropFile(p);\n draw();\n text.focus();\n });\n const face = p.type.startsWith(\"image/\") ? el(\"img\", { src: p.local, alt: \"\" }) : el(\"span\", { class: \"ckw-msgr-file-doc\" }, icon(I.doc, 18), el(\"span\", {}, p.name));\n return el(\"div\", { class: \"ckw-msgr-file\", role: \"listitem\", title: p.name, \"aria-label\": p.id ? p.name : `${p.name}, uploading`, ...(p.id ? {} : { \"aria-busy\": \"true\" }) }, face, x);\n }),\n );\n }\n if (!picked.length) tray.remove();\n else if (!tray.isConnected) form.insertBefore(tray, row);\n };\n\n /** A picture of this tab: the browser asks once, the messenger hides for the frame, then comes back. */\n const shoot = async () => {\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({ video: { displaySurface: \"browser\" }, audio: false, preferCurrentTab: true, selfBrowserSurface: \"include\" } as DisplayMediaStreamOptions);\n } catch (e) {\n if ((e as Error).name !== \"NotAllowedError\" && (e as Error).name !== \"AbortError\") {\n error = \"The screenshot did not work here. Attach a picture instead.\";\n draw();\n }\n return;\n }\n root.style.visibility = \"hidden\";\n let blob: Blob | null = null;\n try {\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n video.srcObject = stream;\n await video.play();\n // Frames from before the panel hid may still be on their way: wait for fresh ones.\n await new Promise((r) => setTimeout(r, 300));\n const v = video as HTMLVideoElement & { requestVideoFrameCallback?: (cb: () => void) => number };\n await new Promise<void>((r) => (v.requestVideoFrameCallback ? v.requestVideoFrameCallback(() => r()) : requestAnimationFrame(() => r())));\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext(\"2d\")?.drawImage(video, 0, 0);\n const encode = (type: string, q?: number) => new Promise<Blob | null>((r) => canvas.toBlob(r, type, q));\n blob = await encode(\"image/png\");\n // A large screen as PNG gets big; a JPEG reads just as well and stays small enough for the AI agent.\n if (blob && blob.size > 4.5 * 1024 * 1024) blob = await encode(\"image/jpeg\", 0.9);\n } catch {\n blob = null;\n } finally {\n for (const t of stream.getTracks()) t.stop();\n root.style.visibility = \"\";\n }\n if (!blob || !blob.size) {\n error = \"The screenshot did not work here. Attach a picture instead.\";\n return draw();\n }\n const stamp = new Date().toISOString().slice(0, 16).replace(/[:T]/g, \"-\");\n addFiles([Object.assign(blob, { name: `screenshot-${stamp}.${blob.type === \"image/png\" ? \"png\" : \"jpg\"}` })]);\n };\n\n // The paperclip: the file picker at once, or a small menu with Screenshot where the browser can take one.\n const amenu = el(\"div\", { class: \"ckw-msgr-menu ckw-msgr-amenu\", role: \"menu\" });\n const amenuOpen = () => amenu.isConnected && !amenu.hasAttribute(\"data-out\");\n const closeAmenu = () => {\n clip.setAttribute(\"aria-expanded\", \"false\");\n leave(amenu, 120);\n };\n const amenuItem = (d: string, name: string, act: () => void) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-menu-i\", role: \"menuitem\" }, icon(d, 15), el(\"span\", {}, name));\n b.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n closeAmenu();\n act();\n });\n return b;\n };\n clip.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n chime.unlock();\n if (!shots) return picker.click();\n if (amenuOpen()) return closeAmenu();\n amenu.replaceChildren(\n amenuItem(I.image, \"Photo or file\", () => picker.click()),\n amenuItem(I.screen, \"Screenshot of this page\", () => void shoot()),\n );\n clip.setAttribute(\"aria-expanded\", \"true\");\n enter(amenu, form);\n (amenu.querySelector(\"button\") as HTMLButtonElement | null)?.focus();\n });\n picker.addEventListener(\"change\", () => {\n addFiles([...(picker.files ?? [])]);\n picker.value = \"\";\n });\n\n const brand = el(\"a\", { class: \"ckw-msgr-powered\", href: BRAND_URL, target: \"_blank\", rel: \"noopener\" }, \"Powered by \", el(\"b\", {}, \"MRRocket\"));\n\n const list = el(\"ol\", { class: \"ckw-msgs\", \"aria-live\": \"polite\", \"aria-label\": \"Messages\" });\n const needEmail = () => askEmail && !o.user()?.email && !thread?.hasEmail;\n const emailOk = () => !email.value.trim() || EMAIL.test(email.value.trim());\n const canSend = () => (!!text.value.trim() || picked.length > 0) && !pending && emailOk();\n\n const go = (v: MessengerView | { article: string }) => {\n const changed = JSON.stringify(v) !== JSON.stringify(view);\n view = v;\n drawn = -1;\n draw();\n if (changed) replay(body, \"ckw-msgr-enter\");\n if (v === \"messages\") {\n markSeen();\n drawFab();\n text.focus();\n } else if (v === \"help\") helpInput.focus();\n schedule(0);\n };\n\n /** A sent picture; once it has its height the chat stays at the bottom, if it was there. */\n const picture = (src: string, alt: string) => {\n const img = el(\"img\", { src, alt, loading: \"lazy\" });\n img.addEventListener(\"load\", () => {\n if (body.scrollHeight - body.scrollTop - body.clientHeight < img.clientHeight + 120) body.scrollTop = body.scrollHeight;\n });\n return img;\n };\n const bubble = (m: ChatMessage, isPending = false) => {\n const li = el(\"li\", { class: \"ckw-msg\", \"data-from\": m.from === \"visitor\" ? \"me\" : \"them\" }, m.body || !m.attachments?.length ? el(\"div\", { class: \"ckw-bubble\" }, m.body) : null);\n if (isPending) li.setAttribute(\"aria-busy\", \"true\");\n // Sent files: pictures as themselves, a PDF as a chip; each opens full size in a new tab.\n if (m.attachments?.length)\n li.append(\n el(\n \"div\",\n { class: \"ckw-msg-files\" },\n ...m.attachments.map((f) =>\n f.type.startsWith(\"image/\")\n ? el(\"a\", { class: \"ckw-msg-img\", href: fileUrl(f.id), target: \"_blank\", rel: \"noopener\", title: f.name }, picture(fileUrl(f.id), f.name))\n : el(\"a\", { class: \"ckw-msgr-cite\", href: fileUrl(f.id), target: \"_blank\", rel: \"noopener\" }, icon(I.doc, 14), el(\"span\", {}, f.name)),\n ),\n ),\n );\n for (const a of m.articles ?? []) {\n const chip = el(\"button\", { type: \"button\", class: \"ckw-msgr-cite\" }, icon(I.doc, 14), el(\"span\", {}, a.title));\n chip.addEventListener(\"click\", () => go({ article: a.id }));\n li.append(chip);\n }\n li.append(el(\"span\", { class: \"ckw-msg-meta\" }, `${m.from !== \"visitor\" ? `${whoLabel[m.from]} · ` : \"\"}${isPending ? \"Sending…\" : timeAgo(m.at)}`));\n return li;\n };\n\n const articleRow = (a: ArticleSummary) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-art\" }, el(\"span\", { class: \"ckw-msgr-art-t\" }, a.title), icon(I.next, 14));\n b.addEventListener(\"click\", () => go({ article: a.id }));\n return b;\n };\n /** A row in Help's lists: a bold name, two lines under it, a count, the arrow. */\n const helpRow = (name: string, sub: string, meta: string, act: () => void) => {\n const b = el(\n \"button\",\n { type: \"button\", class: \"ckw-msgr-hrow\" },\n el(\"span\", { class: \"ckw-msgr-hrow-main\" }, el(\"b\", {}, name), sub ? el(\"span\", { class: \"ckw-msgr-hrow-sub\" }, sub) : null, meta ? el(\"span\", { class: \"ckw-msgr-hrow-meta\" }, meta) : null),\n icon(I.next, 16),\n );\n b.addEventListener(\"click\", act);\n return b;\n };\n\n const searchBox = (placeholder = \"Search for help\") => {\n const wrap = el(\"label\", { class: \"ckw-msgr-search\" });\n const input = el(\"input\", { class: \"ckw-msgr-search-in\", type: \"search\", placeholder, \"aria-label\": \"Search for help\", maxlength: \"200\" });\n input.value = query;\n let t: ReturnType<typeof setTimeout> | undefined;\n input.addEventListener(\"input\", () => {\n query = input.value;\n clearTimeout(t);\n t = setTimeout(() => {\n if (view !== \"help\") return go(\"help\");\n void loadArticles(true);\n }, 250);\n });\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (view !== \"help\") go(\"help\");\n }\n });\n wrap.append(icon(I.search, 16), input);\n return wrap;\n };\n // Help's own field stays the same element between draws, so typing never loses the cursor.\n const helpSearch = searchBox(\"Search our help center…\");\n const helpInput = helpSearch.querySelector(\"input\")!;\n\n let loadingArticles = false;\n const loadArticles = async (force = false) => {\n if (!helpOn || (loadingArticles && !force)) return;\n loadingArticles = true;\n const q = query.trim();\n try {\n const r = await api().articles(q || undefined);\n if (q !== query.trim()) return;\n articles = r.articles;\n if (!q) hasArticles = r.articles.length > 0;\n } catch {\n articles = articles ?? [];\n } finally {\n loadingArticles = false;\n }\n draw();\n };\n // Home's \"Ask a question\" field: what is typed there opens the chat and is sent. The same element between draws, so\n // a read that redraws Home never takes the cursor or the words.\n const askForm = el(\"form\", { class: \"ckw-msgr-askq\" });\n const askIn = el(\"input\", { class: \"ckw-msgr-askq-in\", placeholder: \"Ask a question\", \"aria-label\": \"Ask a question\", maxlength: \"4000\", autocomplete: \"off\" });\n const askGo = el(\"button\", { type: \"submit\", class: \"ckw-msgr-send\", \"aria-label\": \"Send\", disabled: \"\" }, icon(I.up));\n askForm.append(askIn, askGo);\n askIn.addEventListener(\"input\", () => (askGo.disabled = !askIn.value.trim()));\n askForm.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (!askIn.value.trim()) return go(\"messages\");\n text.value = askIn.value;\n askIn.value = \"\";\n askGo.disabled = true;\n go(\"messages\");\n if (canSend()) void submit();\n });\n const drawHome = () => {\n // Two lines like Featurebase: \"Hi, Lukas 👋\" and the greeting in gray (without its own \"Hi!\", said above).\n const first = o.user()?.name?.trim().split(/\\s+/)[0];\n const rest = greeting.replace(/^(hi|hello|hey|hallo)( there)?\\s*[!,.]*\\s*/i, \"\").trim() || \"How can we help you today?\";\n const hero = el(\n \"h2\",\n { class: \"ckw-msgr-hero ckw-msgr-hello\" },\n el(\"span\", {}, first ? `Hi, ${first} ` : \"Hi there \", el(\"span\", { class: \"ckw-msgr-wave\", \"aria-hidden\": \"true\" }, \"👋\")),\n el(\"span\", { class: \"ckw-msgr-hello-sub\" }, rest),\n );\n const last = (thread?.messages ?? []).at(-1);\n const parts: HTMLElement[] = [hero, askForm];\n if (last) {\n const recent = el(\n \"button\",\n { type: \"button\", class: \"ckw-msgr-card ckw-msgr-recent\", \"aria-label\": `Recent message: ${lineOf(last)}` },\n el(\n \"span\",\n { class: \"ckw-msgr-recent-row\" },\n avatar(\"sm\"),\n el(\n \"span\",\n { class: \"ckw-msgr-card-main\" },\n el(\"span\", { class: \"ckw-msgr-card-sub ckw-msgr-recent-text\" }, lineOf(last)),\n el(\"span\", { class: \"ckw-msgr-card-meta\" }, `${last.from === \"visitor\" ? \"You\" : whoLabel[last.from]} · ${timeAgo(last.at)}`),\n ),\n unseen.length ? el(\"span\", { class: \"ckw-msgr-badge\" }, String(unseen.length)) : icon(I.next, 14),\n ),\n );\n recent.addEventListener(\"click\", () => go(\"messages\"));\n parts.push(recent);\n }\n // A few articles to tap; searching is the Help tab's, so Home fits without scrolling.\n if (helpOn && hasArticles !== false) {\n const helpCard = el(\"div\", { class: \"ckw-msgr-card ckw-msgr-card-col\" });\n const top = (articles ?? []).slice(0, 3);\n if (top.length) helpCard.append(...top.map(articleRow));\n else if (articles === null) helpCard.append(el(\"div\", { class: \"ckw-skel ckw-msgr-skel\" }));\n parts.push(helpCard);\n }\n body.replaceChildren(...parts);\n };\n\n const drawHelp = () => {\n if (helpInput.value !== query) helpInput.value = query;\n const q = query.trim();\n const all = articles ?? [];\n const groups = new Map<string, ArticleSummary[]>();\n for (const a of all) groups.set(a.collection, [...(groups.get(a.collection) ?? []), a]);\n const inside = !q && collection !== null ? (groups.get(collection) ?? []) : null;\n const heading = q ? \"Search results\" : inside ? (collection ?? \"\") : \"Most read articles\";\n const parts: HTMLElement[] = [el(\"h2\", { class: \"ckw-msgr-help-h\" }, heading), helpSearch];\n if (articles === null) parts.push(el(\"div\", { class: \"ckw-skel\" }));\n else if (!all.length) {\n const ask = el(\"button\", { type: \"button\", class: \"ckw-btn ckw-btn-primary\" }, \"Send us a message\");\n ask.addEventListener(\"click\", () => go(\"messages\"));\n parts.push(el(\"div\", { class: \"ckw-msgr-empty\" }, el(\"p\", {}, q ? `Nothing found for “${q}”.` : \"No help articles yet.\"), ask));\n } else if (q || inside)\n parts.push(\n el(\n \"div\",\n { class: \"ckw-msgr-hlist\" },\n // The excerpt often opens with the article's own heading; the row shows the title already.\n ...(inside ?? all).map((a) => helpRow(a.title, a.excerpt.startsWith(a.title) ? a.excerpt.slice(a.title.length).trim() : a.excerpt, q ? a.collection : \"\", () => go({ article: a.id }))),\n ),\n );\n else\n parts.push(\n el(\n \"div\",\n { class: \"ckw-msgr-hlist\" },\n ...[...groups].map(([name, items]) =>\n helpRow(name, items.map((a) => a.title).join(\", \"), `${items.length} ${items.length === 1 ? \"article\" : \"articles\"}`, () => {\n collection = name;\n go(\"help\");\n replay(body, \"ckw-msgr-enter\");\n }),\n ),\n ),\n );\n // The field stays in place (moving it would take its focus); only what is around it changes.\n if (body.childNodes[1] !== helpSearch) body.replaceChildren(...parts);\n else {\n (body.firstChild as HTMLElement).replaceWith(parts[0]);\n while (body.childNodes.length > 2) body.lastChild!.remove();\n body.append(...parts.slice(2));\n }\n };\n\n let articleShown: { id: string; node: HTMLElement } | null = null;\n const drawArticle = (id: string) => {\n if (articleShown?.id === id) return body.replaceChildren(articleShown.node);\n const node = el(\"article\", { class: \"ckw-msgr-doc\" }, el(\"div\", { class: \"ckw-skel\" }));\n articleShown = { id, node };\n body.replaceChildren(node);\n api()\n .article(id)\n .then((a) => {\n const foot = el(\"div\", { class: \"ckw-msgr-rate\" });\n const drawRate = () => {\n if (rated.has(id)) return foot.replaceChildren(el(\"span\", {}, \"Thanks for letting us know.\"));\n const yes = el(\"button\", { type: \"button\", class: \"ckw-btn\" }, \"Yes\");\n const no = el(\"button\", { type: \"button\", class: \"ckw-btn\" }, \"No\");\n const rate = (helpful: boolean) => {\n rated = new Set(rated).add(id);\n drawRate();\n api()\n .rateArticle(id, helpful)\n .catch(() => undefined);\n if (!helpful) go(\"messages\");\n };\n yes.addEventListener(\"click\", () => rate(true));\n no.addEventListener(\"click\", () => rate(false));\n foot.replaceChildren(el(\"span\", {}, \"Did this answer your question?\"), el(\"span\", { class: \"ckw-msgr-rate-b\" }, yes, no));\n };\n drawRate();\n const ask = el(\"button\", { type: \"button\", class: \"ckw-btn ckw-msgr-ask\" }, icon(I.chat), \"Still need help? Send us a message\");\n ask.addEventListener(\"click\", () => go(\"messages\"));\n node.replaceChildren(\n el(\"p\", { class: \"ckw-msgr-doc-c\" }, a.collection),\n el(\"h2\", { class: \"ckw-msgr-doc-t\" }, a.title),\n el(\"p\", { class: \"ckw-msgr-doc-c\" }, `Updated ${timeAgo(a.updatedAt)}`),\n el(\"div\", { class: \"ckw-msgr-doc-b\" }, ...a.blocks.map(blockOf)),\n foot,\n ask,\n );\n })\n .catch((e: Error) => {\n articleShown = null;\n node.replaceChildren(el(\"p\", { class: \"ckw-msgr-error\" }, e.message));\n });\n };\n\n let drawn = -1;\n /** What the list shows, so a read that brings nothing new leaves it alone (no flicker, links stay where they are). */\n let listSig = \"\";\n /** How many bubbles the list had: the ones after it are new and glide in. */\n let listCount = -1;\n const suggestions = el(\"div\", { class: \"ckw-msgr-sugg\" });\n const drawMessages = () => {\n const msgs = thread?.messages ?? [];\n const parts: HTMLElement[] = [];\n if (!loaded) parts.push(el(\"div\", { class: \"ckw-skel\" }));\n else {\n const sig = `${msgs.map((m) => m.id).join(\",\")}|${pending ? `${pending.body}+${pending.attachments?.length ?? 0}` : \"\"}|${Math.floor(Date.now() / 60_000)}`;\n if (sig !== listSig) {\n listSig = sig;\n const greet = el(\"li\", { class: \"ckw-msg\", \"data-from\": \"them\" }, el(\"div\", { class: \"ckw-bubble\" }, greeting));\n const items = [greet, ...msgs.map((m) => bubble(m)), ...(pending ? [bubble(pending, true)] : [])];\n if (listCount >= 0) items.slice(listCount).forEach((li) => li.setAttribute(\"data-new\", \"\"));\n listCount = items.length;\n list.replaceChildren(...items);\n }\n parts.push(list);\n // Before the visitor wrote: the most read articles as answers to tap.\n const top = !msgs.some((m) => m.from === \"visitor\") && !pending ? (articles ?? []).slice(0, 3) : [];\n if (top.length) {\n if (suggestions.childNodes.length !== top.length)\n suggestions.replaceChildren(\n ...top.map((a) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-sugg-b\" }, a.title);\n b.addEventListener(\"click\", () => go({ article: a.id }));\n return b;\n }),\n );\n parts.push(suggestions);\n }\n }\n if (thread?.conversation?.status === \"solved\" && !pending) parts.push(el(\"p\", { class: \"ckw-fine ckw-msgr-note\" }, \"This conversation is closed. Write to start a new one.\"));\n if (body.childNodes.length !== parts.length || parts.some((x, i) => body.childNodes[i] !== x)) body.replaceChildren(...parts);\n const count = msgs.length + (pending ? 1 : 0);\n if (count !== drawn) {\n drawn = count;\n body.scrollTop = body.scrollHeight;\n }\n err.textContent = error;\n if (error && !err.isConnected) form.prepend(err);\n else if (!error) err.remove();\n if (needEmail()) {\n if (emailOk()) email.removeAttribute(\"aria-invalid\");\n else email.setAttribute(\"aria-invalid\", \"true\");\n if (!email.isConnected) form.insertBefore(email, tray.isConnected ? tray : row);\n } else email.remove();\n drawTray();\n send.disabled = !canSend();\n };\n\n const draw = () => {\n if (!open) return;\n pop.dataset.view = typeof view === \"string\" ? view : \"article\";\n drawBar();\n if (view === \"home\") drawHome();\n else if (view === \"messages\") drawMessages();\n else if (view === \"help\") drawHelp();\n else drawArticle(view.article);\n const kids: HTMLElement[] = view === \"home\" ? [sky, bar, body] : [bar, body];\n kids.push(view === \"messages\" ? form : tabs);\n if (o.branding !== false) kids.push(brand);\n if (menu.isConnected) kids.push(menu);\n if (pop.childNodes.length !== kids.length || kids.some((k, i) => pop.childNodes[i] !== k)) pop.replaceChildren(...kids);\n };\n\n // ---------- Reading the chat ----------\n const tick = async () => {\n ctrl?.abort();\n ctrl = new AbortController();\n try {\n take(await api().chat(ctrl.signal));\n error = \"\";\n } catch (e) {\n if ((e as Error).name === \"AbortError\") return;\n if (open && view === \"messages\") error = (e as Error).message;\n }\n loaded = true;\n draw();\n drawFab();\n schedule();\n };\n /** The next read: often while the chat is on screen, now and then while the visitor waits for an answer. */\n function schedule(now?: number) {\n clearTimeout(poll);\n const waiting = !!thread?.messages.some((m) => m.from === \"visitor\") && thread?.conversation?.status !== \"solved\";\n const wrote = (thread?.messages ?? []).filter((m) => m.from === \"visitor\").at(-1)?.at;\n const recent = !!wrote && Date.now() - new Date(wrote).getTime() < WAITING_FOR_MS;\n const ms = now ?? (watching() ? POLL_OPEN_MS : waiting && recent ? POLL_WAITING_MS : open || waiting ? POLL_IDLE_MS : 0);\n if (ms || now === 0) poll = setTimeout(() => void tick(), ms);\n }\n const onVisible = () => {\n if (document.visibilityState === \"visible\") schedule(0);\n else clearTimeout(poll);\n };\n document.addEventListener(\"visibilitychange\", onVisible);\n\n const submit = async () => {\n const msg = text.value.trim();\n const files = picked;\n if ((!msg && !files.length) || pending || !emailOk()) return;\n chime.unlock();\n for (const p of files) localUrls.set(p.key, p.local);\n pending = {\n id: \"pending\",\n from: \"visitor\",\n body: msg,\n at: new Date().toISOString(),\n ...(files.length ? { attachments: files.map((p) => ({ id: p.key, name: p.name, type: p.type, size: p.size })) } : {}),\n };\n text.value = \"\";\n picked = [];\n error = \"\";\n draw();\n // Send waits for the uploads; one that failed is left out and said in the error line.\n await Promise.all(files.map((p) => p.up));\n const ids = files.filter((p) => p.id).map((p) => p.id!);\n let sent = false;\n try {\n if (!msg && !ids.length) throw new Error(error || \"The file could not be sent.\");\n take(\n await api().sendChat({\n body: msg,\n email: needEmail() && email.value.trim() ? email.value.trim() : undefined,\n url: window.location.href.slice(0, 500),\n ...(ids.length ? { attachments: ids } : {}),\n // A little context for a bug report; the server reads browser and system from the user agent.\n context: { viewport: `${window.innerWidth}×${window.innerHeight}` },\n }),\n );\n sent = true;\n } catch (e) {\n text.value = msg;\n picked = files.filter((p) => p.id);\n error = (e as Error).message;\n }\n pending = null;\n for (const p of files) localUrls.delete(p.key);\n draw();\n if (sent) for (const p of files) URL.revokeObjectURL(p.local);\n schedule();\n };\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n void submit();\n });\n text.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.isComposing) {\n e.preventDefault();\n void submit();\n }\n });\n text.addEventListener(\"input\", () => (send.disabled = !canSend()));\n // A picture on the clipboard (a screenshot) attaches when pasted into the field.\n text.addEventListener(\"paste\", (e) => {\n const fs = [...(e.clipboardData?.files ?? [])];\n if (!fs.length) return;\n e.preventDefault();\n addFiles(fs);\n });\n // Files dropped anywhere on the panel attach (and open the chat).\n const hasFiles = (e: DragEvent) => !!e.dataTransfer && [...e.dataTransfer.types].includes(\"Files\");\n pop.addEventListener(\"dragover\", (e) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n pop.setAttribute(\"data-drop\", \"\");\n });\n pop.addEventListener(\"dragleave\", (e) => {\n if (!e.relatedTarget || !pop.contains(e.relatedTarget as Node)) pop.removeAttribute(\"data-drop\");\n });\n pop.addEventListener(\"drop\", (e) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n pop.removeAttribute(\"data-drop\");\n addFiles([...(e.dataTransfer?.files ?? [])]);\n });\n email.addEventListener(\"input\", () => draw());\n\n function show(v: MessengerView | { article: string } = \"home\", still = false) {\n const was = open;\n open = true;\n view = v === \"help\" && !helpOn ? \"home\" : v;\n drawn = -1;\n previewGone = true;\n hideTeaser(true);\n pop.toggleAttribute(\"data-still\", still);\n enter(pop);\n if (was) replay(body, \"ckw-msgr-enter\");\n if (articles === null || (view === \"help\" && query)) void loadArticles();\n draw();\n drawFab();\n if (view === \"messages\") {\n markSeen();\n text.focus();\n }\n schedule(0);\n }\n function close() {\n if (!open) return;\n open = false;\n if (menu.isConnected) closeMenu();\n leave(pop, 200);\n drawFab();\n schedule();\n if (launcherOn) fab.focus();\n }\n pop.addEventListener(\"click\", () => amenuOpen() && closeAmenu());\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || !open) return;\n if (amenuOpen()) {\n closeAmenu();\n clip.focus();\n } else if (menuOpen()) {\n closeMenu();\n menuBtn.focus();\n } else close();\n };\n document.addEventListener(\"keydown\", onKey);\n\n // One read on load (the count and preview of answers not seen yet), and the article count for the Help tab.\n void tick();\n if (helpOn) void loadArticles();\n drawFab();\n if (o.opened) show(o.opened, true);\n\n return {\n open: (v) => show(v ?? \"home\"),\n close,\n toggle: () => (open ? close() : show()),\n destroy: () => {\n clearTimeout(poll);\n clearTimeout(teaserTimer);\n for (const t of leaving.values()) clearTimeout(t);\n ctrl?.abort();\n for (const p of picked) forget(p);\n for (const u of localUrls.values()) URL.revokeObjectURL(u);\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"visibilitychange\", onVisible);\n root.remove();\n },\n };\n};\n"],"mappings":"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","names":["list"]}
|
|
1
|
+
{"version":3,"sources":["../src/messenger-ui.ts"],"sourcesContent":["/**\n * The web messenger, after Crisp's: a round launcher (hovered, a small card offers \"Chat\" and \"Search\") and a panel\n * with a bar on top (Home, a \"Chat · Help\" switch while there are both, a ⋮ menu to minimize or widen it). Home shows the greeting,\n * the latest chat and the help search; Chat is the chat with the team, answered in MRRocket › Support by the owner or\n * the Customer experience agent; Help lists the product's published help articles by collection, searchable, read in\n * the panel. While the panel is closed it checks for answers now and then; a new answer plays a short sound, shows a\n * count on the launcher and a preview card above it. Opening, closing, switching and new messages move softly\n * (none of it with reduced motion).\n *\n * Plain DOM, no React, so `<Messenger />` (Next.js) and the script tag share it; both load it only when it is used (a\n * dynamic import, and `sdk-messenger.js` for the script tag). Every text is set with textContent; articles arrive as\n * blocks, never HTML.\n */\nimport {\n type Api,\n type ArticleBlock,\n type ArticleSpan,\n type ArticleSummary,\n BRAND_URL,\n CHAT_FILES_PER_MESSAGE,\n CHAT_FILE_MAX_BYTES,\n CHAT_FILE_TYPES,\n type ChatFile,\n type ChatMessage,\n type ChatThread,\n type MessengerCorners,\n type MessengerLook,\n type MessengerPosition,\n createApi,\n inkOn,\n replyLine,\n} from \"./api-client\";\nimport { injectStyles } from \"./styles-css\";\n\nexport interface MessengerUiOptions {\n host: string;\n apiKey: string;\n /** The visitor id now (it changes on identify and reset). */\n distinctId: () => string;\n /** The signed-in person's id, name and email, when the site called identify. */\n user: () => { id?: string; name?: string; email?: string } | undefined;\n /** The identity hash of the visitor id now (0.16.0), when the site gave one to identify. */\n userHash?: () => string | undefined;\n /** Show the round launcher (default true). Without it the panel opens only through `open()`. */\n launcher?: boolean;\n /** Where the launcher sits (default bottom right); the panel and the cards open from there. */\n position?: MessengerPosition;\n /** The team's name beside its mark on Home. */\n title?: string;\n /** The big line on Home and the first line of an empty chat. */\n greeting?: string;\n /** Ask anonymous visitors for an email (optional for them). Default true. */\n askEmail?: boolean;\n /** Text on the launcher; empty shows the icon only. */\n label?: string;\n /** How soon the team usually answers, said under \"Send us a message\" and in the chat's head. */\n replyTime?: \"minutes\" | \"hours\" | \"day\";\n /** The Help tab with the product's published help articles (default true; hidden while there are none). */\n help?: boolean;\n /** A short sound when an answer arrives (default true). */\n sound?: boolean;\n /** A preview of a new answer above the closed launcher (default true). */\n preview?: boolean;\n theme?: \"light\" | \"dark\" | \"auto\";\n accent?: string;\n /** Up to two more colors blended with the accent in Home's background glow. */\n glow?: string[];\n /** How round panel, bubbles, cards and fields are (default round). */\n corners?: MessengerCorners;\n /** The site's own font (default) or the system's. */\n font?: \"site\" | \"system\";\n /** Home's top: plain (default) or in the accent color. */\n header?: \"plain\" | \"color\";\n /** \"Powered by MRRocket\" at the bottom; MRRocket's server says whether the plan may hide it. */\n branding?: boolean;\n /** The product's icon at the top left of Home (MRRocket sends the product's favicon); without it the title's first letter. */\n logo?: string;\n /** MRRocket's own preview: mount inside this element (positioned) instead of the page. */\n container?: HTMLElement;\n /** MRRocket's own preview: answers from here instead of the server. */\n client?: MessengerClient;\n /** MRRocket's own preview: start open on this view, without the opening motion. */\n opened?: MessengerView;\n}\n\n/** What the messenger asks the server (createApi's part it uses). */\nexport type MessengerClient = Pick<Api, \"chat\" | \"sendChat\" | \"uploadChatFile\" | \"attachmentUrl\" | \"articles\" | \"article\" | \"rateArticle\" | \"messengerLook\">;\n\nexport type MessengerView = \"home\" | \"messages\" | \"help\";\n\nexport interface MessengerHandle {\n /** Opens the panel, on Home or the given tab; `{ article }` opens a help article. */\n open(view?: MessengerView | { article: string }): void;\n close(): void;\n toggle(): void;\n /** Removes the launcher and the panel from the page. */\n destroy(): void;\n}\n\nconst POLL_OPEN_MS = 4000;\n/** While the panel is closed: soon after the visitor wrote, answers are looked for often, later now and then. */\nconst POLL_WAITING_MS = 8000;\nconst POLL_IDLE_MS = 30000;\nconst WAITING_FOR_MS = 10 * 60_000;\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\nconst SEEN_KEY = \"ckw_msgr_seen\";\nconst whoLabel: Record<ChatMessage[\"from\"], string> = { visitor: \"You\", team: \"Team\", ai: \"AI agent\", auto: \"Team\" };\n\nconst readSeen = () => {\n try {\n return window.localStorage.getItem(SEEN_KEY) ?? \"\";\n } catch {\n return \"\";\n }\n};\nconst writeSeen = (id: string) => {\n try {\n window.localStorage.setItem(SEEN_KEY, id);\n } catch {\n // Private mode: the count just shows again next time.\n }\n};\n\nconst timeAgo = (iso: string) => {\n const t = new Date(iso).getTime();\n if (Number.isNaN(t)) return \"\";\n const d = Math.max(0, Date.now() - t) / 1000;\n if (d < 60) return \"just now\";\n if (d < 3600) return `${Math.floor(d / 60)}m ago`;\n if (d < 86400) return `${Math.floor(d / 3600)}h ago`;\n if (d < 86400 * 30) return `${Math.floor(d / 86400)}d ago`;\n return new Date(iso).toLocaleDateString(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" });\n};\n\nconst el = <K extends keyof HTMLElementTagNameMap>(tag: K, attrs: Record<string, string> = {}, ...kids: (Node | string | null | false | undefined)[]) => {\n const e = document.createElement(tag);\n for (const [k, v] of Object.entries(attrs)) e.setAttribute(k, v);\n for (const k of kids) if (k !== null && k !== false && k !== undefined) e.append(k);\n return e;\n};\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n/** A line icon on a 24-unit grid (Lucide's shapes, ISC). */\nconst icon = (d: string, size = 16) => {\n const svg = document.createElementNS(SVG_NS, \"svg\");\n for (const [k, v] of Object.entries({ class: \"ckw-icon\", width: String(size), height: String(size), viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", \"stroke-width\": \"1.75\", \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\", \"aria-hidden\": \"true\" }))\n svg.setAttribute(k, v);\n const path = document.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"d\", d);\n svg.appendChild(path);\n return svg;\n};\nconst I = {\n cross: \"M18 6 6 18M6 6l12 12\",\n chat: \"M7.9 20A9 9 0 1 0 4 16.1L2 22z\",\n send: \"M5 12h14M12 5l7 7-7 7\",\n up: \"M12 19V5M5 12l7-7 7 7\",\n home: \"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\",\n back: \"m15 18-6-6 6-6\",\n next: \"m9 18 6-6-6-6\",\n search: \"M19 11a8 8 0 1 1-16 0 8 8 0 0 1 16 0zM21 21l-4.3-4.3\",\n doc: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7zM14 2v4a2 2 0 0 0 2 2h4M10 9H8M16 13H8M16 17H8\",\n book: \"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\",\n dots: \"M13 12a1 1 0 1 1-2 0 1 1 0 0 1 2 0zM13 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0zM13 19a1 1 0 1 1-2 0 1 1 0 0 1 2 0z\",\n expand: \"M15 3h6v6M21 3l-7 7M3 21l7-7M9 21H3v-6\",\n collapse: \"m14 10 7-7M20 10h-6V4M3 21l7-7M4 14h6v6\",\n minus: \"M5 12h14\",\n down: \"m6 9 6 6 6-6\",\n help: \"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20zM9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3M12 17h.01\",\n clip: \"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\",\n image: \"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zM9 11a2 2 0 1 0 0-4 2 2 0 0 0 0 4zM21 15l-3.09-3.09a2 2 0 0 0-2.82 0L6 21\",\n screen: \"M20 3H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zM8 21h8M12 17v4\",\n};\n\n/** A message's words for a one-line preview: its text, or what it sent. */\nconst lineOf = (m: ChatMessage) => m.body || (m.attachments?.length === 1 ? `Sent ${m.attachments[0].name}` : m.attachments?.length ? `Sent ${m.attachments.length} files` : \"\");\n\n/** The browser can grab a picture of this tab (not on phones, where people screenshot with the phone and attach it). */\nconst canShoot = () => typeof navigator !== \"undefined\" && typeof navigator.mediaDevices?.getDisplayMedia === \"function\";\n/** The launcher's filled bubble (24-unit grid). */\nconst BUBBLE = \"M7.9 20A9 9 0 1 0 4 16.1L2 22z\";\nconst filled = (d: string, size: number) => {\n const svg = document.createElementNS(SVG_NS, \"svg\");\n for (const [k, v] of Object.entries({ class: \"ckw-icon\", width: String(size), height: String(size), viewBox: \"0 0 24 24\", fill: \"currentColor\", stroke: \"currentColor\", \"stroke-width\": \"1.5\", \"stroke-linejoin\": \"round\", \"aria-hidden\": \"true\" }))\n svg.setAttribute(k, v);\n const path = document.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"d\", d);\n svg.appendChild(path);\n return svg;\n};\n\n/** A filled shape with lines cut into it in the ground's color (`.ckw-cut`): the current tab's icon, the launcher's bubble. */\nconst duo = (shape: string, cut: string, size: number, width = 2) => {\n const svg = filled(shape, size);\n const path = document.createElementNS(SVG_NS, \"path\");\n for (const [k, v] of Object.entries({ d: cut, class: \"ckw-cut\", fill: \"none\", \"stroke-width\": String(width), \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\" })) path.setAttribute(k, v);\n svg.appendChild(path);\n return svg;\n};\nconst DOTS = \"M8 12h.01M12 12h.01M16 12h.01\";\nconst HOUSE = \"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\";\nconst SMILE = \"M9.5 15.5c1.4 1 3.6 1 5 0\";\nconst DISC = \"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z\";\nconst QMARK = \"M9.4 9.2a2.7 2.7 0 0 1 5.2 1c0 1.8-2.6 2.5-2.6 2.5M12 16.8h.01\";\n\n/** A soft two-note chime made with Web Audio (no file to load). Browsers allow it once the visitor has clicked. */\nconst chime = (() => {\n let ctx: AudioContext | null = null;\n const get = () => {\n const AC = window.AudioContext ?? (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!AC) return null;\n ctx ??= new AC();\n return ctx;\n };\n return {\n /** Call from a click so later sounds may play. */\n unlock: () => {\n try {\n const c = get();\n if (c?.state === \"suspended\") void c.resume();\n } catch {\n // No audio: no sound.\n }\n },\n play: () => {\n try {\n const c = get();\n if (!c || c.state !== \"running\") return;\n const t = c.currentTime;\n [880, 1318.5].forEach((f, i) => {\n const o = c.createOscillator();\n const g = c.createGain();\n const at = t + i * 0.11;\n o.type = \"sine\";\n o.frequency.value = f;\n g.gain.setValueAtTime(0.0001, at);\n g.gain.exponentialRampToValueAtTime(0.12, at + 0.012);\n g.gain.exponentialRampToValueAtTime(0.0001, at + 0.32);\n o.connect(g);\n g.connect(c.destination);\n o.start(at);\n o.stop(at + 0.34);\n });\n } catch {\n // No audio: no sound.\n }\n },\n };\n})();\n\nconst spansOf = (spans: ArticleSpan[]) =>\n spans.map((s) => {\n let node: HTMLElement = s.href ? el(\"a\", { href: s.href, target: \"_blank\", rel: \"noopener noreferrer\" }, s.text) : el(\"span\", {}, s.text);\n if (s.code) node = el(\"code\", {}, node);\n if (s.italic) node = el(\"em\", {}, node);\n if (s.bold) node = el(\"strong\", {}, node);\n return node;\n });\n\nconst blockOf = (b: ArticleBlock): HTMLElement => {\n switch (b.type) {\n case \"h2\":\n case \"h3\":\n return el(b.type, {}, ...spansOf(b.spans));\n case \"quote\":\n return el(\"blockquote\", {}, ...spansOf(b.spans));\n case \"ul\":\n case \"ol\":\n return el(b.type, {}, ...b.items.map((it) => el(\"li\", {}, ...spansOf(it))));\n case \"code\":\n return el(\"pre\", {}, el(\"code\", {}, b.text));\n case \"hr\":\n return el(\"hr\");\n default:\n return el(\"p\", {}, ...spansOf(b.spans));\n }\n};\n\n/** How long the launcher waits for the look from MRRocket before it shows with the code's options and the defaults. */\nconst LOOK_WAIT_MS = 2500;\n\n/**\n * Mounts the messenger with its look from MRRocket (Support › Messenger) underneath what the code passes: an option the\n * code sets wins, one it leaves out comes from MRRocket, then the default. Calls made before the look arrived wait.\n */\nexport const mountMessenger = (o: MessengerUiOptions): MessengerHandle => {\n let real: MessengerHandle | null = null;\n let gone = false;\n const queued: ((h: MessengerHandle) => void)[] = [];\n const later = (fn: (h: MessengerHandle) => void) => (real ? fn(real) : queued.push(fn));\n const ctrl = new AbortController();\n const start = (look: Partial<MessengerLook> | null) => {\n if (real || gone) return;\n const defined = Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined)) as MessengerUiOptions;\n // The branding comes from the server alone: what the plan allows is not the site's code to decide.\n real = build({ ...(look ?? {}), ...defined, accent: o.accent ?? look?.accent, theme: o.theme ?? look?.theme, branding: look?.branding ?? true });\n for (const fn of queued.splice(0)) fn(real);\n };\n const timer = setTimeout(() => start(null), LOOK_WAIT_MS);\n (o.client ?? createApi({ host: o.host, apiKey: o.apiKey, distinctId: o.distinctId(), user: o.user(), userHash: o.userHash?.() }))\n .messengerLook(ctrl.signal)\n .then((look) => start(look))\n .catch(() => start(null))\n .finally(() => clearTimeout(timer));\n return {\n open: (v) => later((h) => h.open(v)),\n close: () => real?.close(),\n toggle: () => later((h) => h.toggle()),\n destroy: () => {\n gone = true;\n ctrl.abort();\n clearTimeout(timer);\n real?.destroy();\n },\n };\n};\n\nconst PLACES: MessengerPosition[] = [\"top-left\", \"top-center\", \"top-right\", \"middle-left\", \"middle-right\", \"bottom-left\", \"bottom-center\", \"bottom-right\"];\n\nconst build = (o: MessengerUiOptions): MessengerHandle => {\n injectStyles();\n // A script tag's attribute can say anything: an unknown place, corner or top is the default.\n const position = PLACES.find((p) => p === o.position) ?? \"bottom-right\";\n const title = o.title || \"Support\";\n const greeting = o.greeting || \"Hi! How can we help?\";\n const askEmail = o.askEmail ?? true;\n const label = o.label ?? \"\";\n const reply = replyLine(o.replyTime);\n /** The team's mark: the first letter of the title, on the accent. */\n const initial = (title.trim()[0] ?? \"?\").toUpperCase();\n const launcherOn = o.launcher ?? true;\n const helpOn = o.help ?? true;\n const soundOn = o.sound ?? true;\n const previewOn = o.preview ?? true;\n const api = (): MessengerClient => o.client ?? createApi({ host: o.host, apiKey: o.apiKey, distinctId: o.distinctId(), user: o.user(), userHash: o.userHash?.() });\n\n const root = el(\"div\", {\n class: \"ckw-root\",\n \"data-theme\": o.theme ?? \"auto\",\n \"data-corners\": o.corners === \"soft\" || o.corners === \"square\" ? o.corners : \"round\",\n \"data-font\": o.font === \"system\" ? \"system\" : \"site\",\n \"data-header\": o.header === \"color\" ? \"color\" : \"plain\",\n });\n if (o.container) root.setAttribute(\"data-contained\", \"\");\n if (o.accent) {\n root.style.setProperty(\"--ckw-accent\", o.accent);\n root.style.setProperty(\"--ckw-accent-ink\", inkOn(o.accent));\n }\n o.glow?.slice(0, 2).forEach((c, i) => /^#[0-9a-f]{6}$/i.test(c) && root.style.setProperty(`--ckw-glow${i + 2}`, c));\n (o.container ?? document.body).appendChild(root);\n\n let open = false;\n let view: MessengerView | { article: string } = \"home\";\n let thread: ChatThread | null = null;\n let loaded = false;\n let error = \"\";\n let pending: ChatMessage | null = null;\n /** The newest team message seen in this page load: what counts as new after it. */\n let lastKnown: string | null = null;\n let unseen: ChatMessage[] = [];\n let previewGone = false;\n let poll: ReturnType<typeof setTimeout> | undefined;\n let ctrl: AbortController | null = null;\n let articles: ArticleSummary[] | null = null;\n let query = \"\";\n let rated = new Set<string>();\n /** Whether the product has any published article: the Help tab and Home's help card hide when it has none. */\n let hasArticles: boolean | null = null;\n /** The help collection opened from Help's list (null: the list of collections). */\n let collection: string | null = null;\n /** The panel widened from the ⋮ menu. */\n let wide = false;\n\n const teamMsgs = (t: ChatThread | null) => (t?.messages ?? []).filter((m) => m.from !== \"visitor\");\n const lastTeamId = (t: ChatThread | null) => teamMsgs(t).at(-1)?.id ?? \"\";\n const watching = () => open && view === \"messages\" && document.visibilityState !== \"hidden\";\n\n /** Takes a thread from the server: new answers count, chime and show in the preview. */\n const take = (t: ChatThread) => {\n const team = teamMsgs(t);\n if (lastKnown === null) {\n // First read: answers the visitor never saw in an earlier visit count, without a sound.\n const seen = readSeen();\n const i = team.findIndex((m) => m.id === seen);\n unseen = t.messages.some((m) => m.from === \"visitor\") ? team.slice(i + 1).filter((m) => m.from !== \"auto\") : [];\n } else {\n const i = team.findIndex((m) => m.id === lastKnown);\n const fresh = team.slice(i + 1).filter((m) => m.from !== \"auto\");\n if (fresh.length) {\n if (soundOn) chime.play();\n if (!watching()) {\n unseen = [...unseen, ...fresh];\n previewGone = false;\n }\n }\n }\n lastKnown = lastTeamId(t);\n thread = t;\n if (watching()) markSeen();\n };\n const markSeen = () => {\n unseen = [];\n const id = lastTeamId(thread);\n if (id) writeSeen(id);\n };\n\n const avatar = (size?: \"sm\") => el(\"span\", { class: `ckw-msgr-av${size ? \" ckw-msgr-av-sm\" : \"\"}`, \"aria-hidden\": \"true\" }, initial);\n /** Home's top left: the product's icon, or its first letter when it has none (or the icon fails to load). */\n const logo = el(\"span\", { class: \"ckw-msgr-logo\", \"aria-hidden\": \"true\" });\n if (o.logo) {\n const img = el(\"img\", { src: o.logo, alt: \"\" });\n img.addEventListener(\"error\", () => logo.replaceChildren(avatar(\"sm\")));\n logo.append(img);\n } else logo.append(avatar(\"sm\"));\n /** Home's background: a soft silk of the accent with a field of dots drifting through it, top right. */\n const sky = el(\"div\", { class: \"ckw-msgr-sky\", \"aria-hidden\": \"true\" });\n\n // ---------- Coming and going ----------\n /** Pending removals: a node that leaves plays its way out first (data-out), unless it is shown again meanwhile. */\n const leaving = new Map<HTMLElement, ReturnType<typeof setTimeout>>();\n const enter = (node: HTMLElement, parent: HTMLElement = root) => {\n clearTimeout(leaving.get(node));\n leaving.delete(node);\n node.removeAttribute(\"data-out\");\n if (!node.isConnected) parent.appendChild(node);\n };\n const leave = (node: HTMLElement, ms = 180) => {\n if (!node.isConnected || leaving.has(node)) return;\n node.setAttribute(\"data-out\", \"\");\n leaving.set(\n node,\n setTimeout(() => {\n leaving.delete(node);\n node.removeAttribute(\"data-out\");\n node.remove();\n }, ms),\n );\n };\n /** Plays an entrance again on a node that stays (a new view in the same body). */\n const replay = (node: HTMLElement, cls: string) => {\n node.classList.remove(cls);\n void node.offsetWidth;\n node.classList.add(cls);\n };\n\n // ---------- Launcher, teaser and preview ----------\n const fab = el(\"button\", { type: \"button\", class: `ckw-fab ckw-msgr-fab${label ? \"\" : \" ckw-msgr-round\"}`, \"data-pos\": position, \"aria-haspopup\": \"dialog\" });\n const fabIcons = el(\n \"span\",\n { class: \"ckw-msgr-fab-ic\", \"aria-hidden\": \"true\" },\n el(\"span\", { class: \"ckw-msgr-fab-i\", \"data-i\": \"chat\" }, duo(BUBBLE, DOTS, label ? 20 : 27, 2.6)),\n el(\"span\", { class: \"ckw-msgr-fab-i\", \"data-i\": \"x\" }, icon(I.down, label ? 18 : 24)),\n );\n const fabCount = el(\"span\", { class: \"ckw-msgr-count\", \"aria-hidden\": \"true\" });\n fab.append(fabIcons);\n if (label) fab.append(el(\"span\", {}, label));\n const prev = el(\"div\", { class: \"ckw-msgr-preview\", \"data-pos\": position, role: \"status\" });\n const drawFab = () => {\n fab.toggleAttribute(\"data-open\", open);\n if (unseen.length && !open) {\n const n = String(Math.min(unseen.length, 9));\n if (fabCount.textContent !== n) fabCount.textContent = n;\n if (!fabCount.isConnected) fab.append(fabCount);\n } else fabCount.remove();\n fab.setAttribute(\"aria-expanded\", String(open));\n fab.setAttribute(\"aria-label\", open ? \"Close chat\" : unseen.length ? `Open chat, ${unseen.length} new ${unseen.length === 1 ? \"reply\" : \"replies\"}` : \"Open chat\");\n drawPreview();\n };\n const previewShown = () => previewOn && !open && !previewGone && !!unseen.length && launcherOn;\n const drawPreview = () => {\n const m = unseen.at(-1);\n if (!previewShown() || !m) return leave(prev);\n hideTeaser(true);\n const x = el(\"button\", { type: \"button\", class: \"ckw-msgr-preview-x\", \"aria-label\": \"Dismiss\" }, icon(I.cross, 14));\n x.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n previewGone = true;\n drawPreview();\n });\n const card = el(\n \"button\",\n { type: \"button\", class: \"ckw-msgr-preview-card\" },\n el(\n \"span\",\n { class: \"ckw-msgr-preview-main\" },\n el(\"span\", { class: \"ckw-msgr-preview-who\" }, `${whoLabel[m.from]}${unseen.length > 1 ? ` · ${unseen.length} new` : \"\"}`),\n el(\"span\", { class: \"ckw-msgr-preview-text\" }, lineOf(m)),\n ),\n );\n card.addEventListener(\"click\", () => show(\"messages\"));\n prev.replaceChildren(card, x);\n enter(prev);\n };\n\n /** Hovering the closed launcher: a small card with the greeting, the reply time, \"Chat\" and \"Search\". */\n const teaser = el(\"div\", { class: \"ckw-msgr-teaser\", \"data-pos\": position });\n let teaserTimer: ReturnType<typeof setTimeout> | undefined;\n const showTeaser = () => {\n clearTimeout(teaserTimer);\n if (open || previewShown() || !launcherOn) return;\n const chat = el(\"button\", { type: \"button\", class: \"ckw-msgr-teaser-b\", \"data-main\": \"\" }, icon(I.chat), el(\"span\", {}, \"Chat\"));\n chat.addEventListener(\"click\", () => show(\"messages\"));\n const buttons: HTMLElement[] = [chat];\n if (helpOn && hasArticles) {\n const search = el(\"button\", { type: \"button\", class: \"ckw-msgr-teaser-b\" }, icon(I.search), el(\"span\", {}, \"Search\"));\n search.addEventListener(\"click\", () => show(\"help\"));\n buttons.push(search);\n }\n teaser.replaceChildren(\n el(\n \"div\",\n { class: \"ckw-msgr-teaser-top\" },\n el(\"span\", { class: \"ckw-msgr-teaser-t\" }, el(\"b\", {}, greeting), el(\"span\", { class: \"ckw-msgr-online\" }, reply)),\n avatar(),\n ),\n el(\"div\", { class: \"ckw-msgr-teaser-row\" }, ...buttons),\n );\n enter(teaser);\n };\n function hideTeaser(now = false) {\n clearTimeout(teaserTimer);\n if (now) return leave(teaser, 140);\n teaserTimer = setTimeout(() => leave(teaser, 140), 260);\n }\n const hoverable = (e: PointerEvent) => e.pointerType === \"mouse\";\n for (const node of [fab, teaser] as HTMLElement[]) {\n node.addEventListener(\"pointerenter\", (e) => hoverable(e) && (node === fab ? showTeaser() : clearTimeout(teaserTimer)));\n node.addEventListener(\"pointerleave\", (e) => hoverable(e) && hideTeaser());\n }\n\n fab.addEventListener(\"click\", () => {\n chime.unlock();\n hideTeaser(true);\n if (open) close();\n else show(unseen.length ? \"messages\" : \"home\");\n });\n if (launcherOn) root.appendChild(fab);\n\n // ---------- Panel ----------\n const pop = el(\"div\", { class: \"ckw-pop ckw-msgr\", \"data-pos\": position, role: \"dialog\", \"aria-label\": title });\n const bar = el(\"div\", { class: \"ckw-msgr-bar\" });\n const body = el(\"div\", { class: \"ckw-pop-body ckw-msgr-body\" });\n pop.addEventListener(\"click\", () => chime.unlock());\n\n // The bar keeps its elements between draws; its middle says where the visitor is (the team in a chat, Help).\n const lead = el(\"span\", { class: \"ckw-msgr-lead\" });\n const mid = el(\"span\", { class: \"ckw-msgr-mid\" });\n // Home · Messages · Help along the foot like an app's tab bar (the open chat has its composer there instead):\n // a line icon, filled while its tab is the current one.\n const tabs = el(\"nav\", { class: \"ckw-msgr-tabs\", \"aria-label\": \"Messenger\" });\n const tab = (v: MessengerView, name: string, line: string, shape: string, cut: string) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-tab\" }, el(\"span\", { class: \"ckw-msgr-tab-ic\" }, icon(line, 22), duo(shape, cut, 22)), el(\"span\", {}, name));\n b.addEventListener(\"click\", () => {\n collection = null;\n go(v);\n });\n return b;\n };\n const homeTab = tab(\"home\", \"Home\", I.home, HOUSE, SMILE);\n const chatTab = tab(\"messages\", \"Messages\", I.chat, BUBBLE, DOTS);\n const helpTab = tab(\"help\", \"Help\", I.help, DISC, QMARK);\n const tabCount = el(\"span\", { class: \"ckw-msgr-count ckw-msgr-count-tab\", \"aria-hidden\": \"true\" });\n const menuBtn = el(\"button\", { type: \"button\", class: \"ckw-msgr-ib\", \"aria-label\": \"More\", \"aria-haspopup\": \"menu\", \"aria-expanded\": \"false\" }, icon(I.dots, 18));\n /** On a phone the panel covers the launcher, so it has its own close. */\n const xBtn = el(\"button\", { type: \"button\", class: \"ckw-msgr-ib ckw-msgr-x\", \"aria-label\": \"Close messenger\" }, icon(I.cross));\n xBtn.addEventListener(\"click\", () => close());\n bar.append(lead, mid, el(\"span\", { class: \"ckw-msgr-trail\" }, menuBtn, xBtn));\n\n const menu = el(\"div\", { class: \"ckw-msgr-menu\", role: \"menu\" });\n const menuOpen = () => menu.isConnected && !menu.hasAttribute(\"data-out\");\n const closeMenu = () => {\n menuBtn.setAttribute(\"aria-expanded\", \"false\");\n leave(menu, 120);\n };\n const menuItem = (d: string, name: string, act: () => void) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-menu-i\", role: \"menuitem\" }, icon(d, 15), el(\"span\", {}, name));\n b.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n closeMenu();\n act();\n });\n return b;\n };\n menuBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (menuOpen()) return closeMenu();\n menu.replaceChildren(\n el(\"span\", { class: \"ckw-msgr-menu-h\" }, \"Quick actions\"),\n menuItem(I.minus, \"Minimize chat\", () => close()),\n menuItem(wide ? I.collapse : I.expand, wide ? \"Collapse view\" : \"Expand view\", () => {\n wide = !wide;\n pop.toggleAttribute(\"data-wide\", wide);\n }),\n );\n menuBtn.setAttribute(\"aria-expanded\", \"true\");\n enter(menu, pop);\n (menu.querySelector(\"button\") as HTMLButtonElement | null)?.focus();\n });\n pop.addEventListener(\"click\", () => menuOpen() && closeMenu());\n\n const drawBar = () => {\n const back = (to: () => void, name: string) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-ib\", \"aria-label\": name }, icon(I.back, 18));\n b.addEventListener(\"click\", to);\n return b;\n };\n if (typeof view !== \"string\")\n lead.replaceChildren(\n back(() => go(\"help\"), \"Back to help\"),\n );\n else if (view === \"help\" && collection && !query.trim())\n lead.replaceChildren(\n back(() => {\n collection = null;\n go(\"help\");\n }, \"All collections\"),\n );\n else if (view === \"messages\") lead.replaceChildren(back(() => go(\"home\"), \"Back to home\"));\n else if (view === \"home\") lead.replaceChildren(logo);\n else lead.replaceChildren();\n if (view === \"messages\") mid.replaceChildren(avatar(\"sm\"), el(\"span\", { class: \"ckw-msgr-mid-t\" }, el(\"b\", {}, title), el(\"span\", { class: \"ckw-msgr-online\" }, reply)));\n else if (view === \"help\") mid.replaceChildren(el(\"b\", {}, \"Help\"));\n else mid.replaceChildren();\n // Without published articles there is no Help tab: Home and Messages.\n const items = helpOn && hasArticles !== false ? [homeTab, chatTab, helpTab] : [homeTab, chatTab];\n if (tabs.childNodes.length !== items.length) tabs.replaceChildren(...items);\n homeTab.setAttribute(\"aria-current\", view === \"home\" ? \"page\" : \"false\");\n chatTab.setAttribute(\"aria-current\", view === \"messages\" ? \"page\" : \"false\");\n helpTab.setAttribute(\"aria-current\", view !== \"home\" && view !== \"messages\" ? \"page\" : \"false\");\n if (unseen.length && view !== \"messages\") {\n tabCount.textContent = String(Math.min(unseen.length, 9));\n if (!tabCount.isConnected) chatTab.firstChild!.appendChild(tabCount);\n } else tabCount.remove();\n };\n\n // The chat's compose form keeps its elements between draws, so the field never loses the focus.\n const form = el(\"form\", { class: \"ckw-msgr-compose\" });\n const err = el(\"p\", { class: \"ckw-msgr-error\", role: \"alert\" });\n const email = el(\"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\" });\n const row = el(\"div\", { class: \"ckw-msgr-box\" });\n const text = el(\"textarea\", { class: \"ckw-textarea ckw-msgr-input\", rows: \"1\", placeholder: \"Write your message…\", \"aria-label\": \"Message\", maxlength: \"4000\" });\n const send = el(\"button\", { type: \"submit\", class: \"ckw-msgr-send\", \"aria-label\": \"Send\" }, icon(I.up));\n // Files for the next message (screenshots, photos, a PDF): picked with the paperclip, pasted or dropped onto the\n // panel. Each uploads the moment it is picked; Send waits for the uploads.\n const shots = canShoot();\n const clip = el(\n \"button\",\n { type: \"button\", class: \"ckw-msgr-clip\", \"aria-label\": shots ? \"Attach a file or a screenshot\" : \"Attach a file\", ...(shots ? { \"aria-haspopup\": \"menu\", \"aria-expanded\": \"false\" } : {}) },\n icon(I.clip, 18),\n );\n row.append(text, el(\"div\", { class: \"ckw-msgr-tools\" }, clip, el(\"span\", { class: \"ckw-msgr-sp\" }), send));\n row.addEventListener(\"click\", (e) => e.target === row && text.focus());\n form.append(row);\n const picker = el(\"input\", { type: \"file\", accept: CHAT_FILE_TYPES.join(\",\"), multiple: \"\", hidden: \"\", tabindex: \"-1\", \"aria-hidden\": \"true\" });\n form.append(picker);\n const tray = el(\"div\", { class: \"ckw-msgr-files\", role: \"list\", \"aria-label\": \"Files to send\" });\n\n interface Picked {\n key: string;\n name: string;\n type: ChatFile[\"type\"];\n size: number;\n /** The picture on this device, shown until the server has it. */\n local: string;\n /** The upload id once the upload finished. */\n id?: string;\n up: Promise<void>;\n ctrl: AbortController;\n }\n let picked: Picked[] = [];\n /** Pictures of the message on its way, by their local key. */\n const localUrls = new Map<string, string>();\n const fileUrl = (id: string) => localUrls.get(id) ?? api().attachmentUrl(id);\n const forget = (p: Picked) => {\n p.ctrl.abort();\n if (![...localUrls.values()].includes(p.local)) URL.revokeObjectURL(p.local);\n };\n const dropFile = (p: Picked) => {\n picked = picked.filter((x) => x !== p);\n forget(p);\n };\n const addFiles = (list: (Blob & { name?: string })[]) => {\n error = \"\";\n for (const f of list) {\n const name = f.name || \"screenshot.png\";\n if (picked.length >= CHAT_FILES_PER_MESSAGE) {\n error = `Up to ${CHAT_FILES_PER_MESSAGE} files per message.`;\n break;\n }\n if (!(CHAT_FILE_TYPES as readonly string[]).includes(f.type)) {\n error = \"Only pictures (PNG, JPEG, WebP, GIF) and PDFs can be sent.\";\n continue;\n }\n if (f.size > CHAT_FILE_MAX_BYTES) {\n error = `${name} is larger than 10 MB.`;\n continue;\n }\n const p: Picked = { key: `local-${Date.now().toString(36)}${Math.random().toString(36).slice(2, 7)}`, name, type: f.type as ChatFile[\"type\"], size: f.size, local: URL.createObjectURL(f), up: Promise.resolve(), ctrl: new AbortController() };\n p.up = api()\n .uploadChatFile(f, p.ctrl.signal)\n .then(\n (r) => {\n p.id = r.id;\n draw();\n },\n (e: Error) => {\n if (e.name === \"AbortError\") return;\n dropFile(p);\n error = `${p.name}: ${e.message}`;\n draw();\n },\n );\n picked.push(p);\n }\n if (open && view !== \"messages\") go(\"messages\");\n else draw();\n text.focus();\n };\n let traySig = \"\";\n const drawTray = () => {\n const sig = picked.map((p) => `${p.key}:${p.id ? 1 : 0}`).join(\",\");\n if (sig !== traySig) {\n traySig = sig;\n tray.replaceChildren(\n ...picked.map((p) => {\n const x = el(\"button\", { type: \"button\", class: \"ckw-msgr-file-x\", \"aria-label\": `Remove ${p.name}` }, icon(I.cross, 12));\n x.addEventListener(\"click\", () => {\n dropFile(p);\n draw();\n text.focus();\n });\n const face = p.type.startsWith(\"image/\") ? el(\"img\", { src: p.local, alt: \"\" }) : el(\"span\", { class: \"ckw-msgr-file-doc\" }, icon(I.doc, 18), el(\"span\", {}, p.name));\n return el(\"div\", { class: \"ckw-msgr-file\", role: \"listitem\", title: p.name, \"aria-label\": p.id ? p.name : `${p.name}, uploading`, ...(p.id ? {} : { \"aria-busy\": \"true\" }) }, face, x);\n }),\n );\n }\n if (!picked.length) tray.remove();\n else if (!tray.isConnected) form.insertBefore(tray, row);\n };\n\n /** A picture of this tab: the browser asks once, the messenger hides for the frame, then comes back. */\n const shoot = async () => {\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({ video: { displaySurface: \"browser\" }, audio: false, preferCurrentTab: true, selfBrowserSurface: \"include\" } as DisplayMediaStreamOptions);\n } catch (e) {\n if ((e as Error).name !== \"NotAllowedError\" && (e as Error).name !== \"AbortError\") {\n error = \"The screenshot did not work here. Attach a picture instead.\";\n draw();\n }\n return;\n }\n root.style.visibility = \"hidden\";\n let blob: Blob | null = null;\n try {\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n video.srcObject = stream;\n await video.play();\n // Frames from before the panel hid may still be on their way: wait for fresh ones.\n await new Promise((r) => setTimeout(r, 300));\n const v = video as HTMLVideoElement & { requestVideoFrameCallback?: (cb: () => void) => number };\n await new Promise<void>((r) => (v.requestVideoFrameCallback ? v.requestVideoFrameCallback(() => r()) : requestAnimationFrame(() => r())));\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext(\"2d\")?.drawImage(video, 0, 0);\n const encode = (type: string, q?: number) => new Promise<Blob | null>((r) => canvas.toBlob(r, type, q));\n blob = await encode(\"image/png\");\n // A large screen as PNG gets big; a JPEG reads just as well and stays small enough for the AI agent.\n if (blob && blob.size > 4.5 * 1024 * 1024) blob = await encode(\"image/jpeg\", 0.9);\n } catch {\n blob = null;\n } finally {\n for (const t of stream.getTracks()) t.stop();\n root.style.visibility = \"\";\n }\n if (!blob || !blob.size) {\n error = \"The screenshot did not work here. Attach a picture instead.\";\n return draw();\n }\n const stamp = new Date().toISOString().slice(0, 16).replace(/[:T]/g, \"-\");\n addFiles([Object.assign(blob, { name: `screenshot-${stamp}.${blob.type === \"image/png\" ? \"png\" : \"jpg\"}` })]);\n };\n\n // The paperclip: the file picker at once, or a small menu with Screenshot where the browser can take one.\n const amenu = el(\"div\", { class: \"ckw-msgr-menu ckw-msgr-amenu\", role: \"menu\" });\n const amenuOpen = () => amenu.isConnected && !amenu.hasAttribute(\"data-out\");\n const closeAmenu = () => {\n clip.setAttribute(\"aria-expanded\", \"false\");\n leave(amenu, 120);\n };\n const amenuItem = (d: string, name: string, act: () => void) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-menu-i\", role: \"menuitem\" }, icon(d, 15), el(\"span\", {}, name));\n b.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n closeAmenu();\n act();\n });\n return b;\n };\n clip.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n chime.unlock();\n if (!shots) return picker.click();\n if (amenuOpen()) return closeAmenu();\n amenu.replaceChildren(\n amenuItem(I.image, \"Photo or file\", () => picker.click()),\n amenuItem(I.screen, \"Screenshot of this page\", () => void shoot()),\n );\n clip.setAttribute(\"aria-expanded\", \"true\");\n enter(amenu, form);\n (amenu.querySelector(\"button\") as HTMLButtonElement | null)?.focus();\n });\n picker.addEventListener(\"change\", () => {\n addFiles([...(picker.files ?? [])]);\n picker.value = \"\";\n });\n\n const brand = el(\"a\", { class: \"ckw-msgr-powered\", href: BRAND_URL, target: \"_blank\", rel: \"noopener\" }, \"Powered by \", el(\"b\", {}, \"MRRocket\"));\n\n const list = el(\"ol\", { class: \"ckw-msgs\", \"aria-live\": \"polite\", \"aria-label\": \"Messages\" });\n const needEmail = () => askEmail && !o.user()?.email && !thread?.hasEmail;\n const emailOk = () => !email.value.trim() || EMAIL.test(email.value.trim());\n const canSend = () => (!!text.value.trim() || picked.length > 0) && !pending && emailOk();\n\n const go = (v: MessengerView | { article: string }) => {\n const changed = JSON.stringify(v) !== JSON.stringify(view);\n view = v;\n drawn = -1;\n draw();\n if (changed) replay(body, \"ckw-msgr-enter\");\n if (v === \"messages\") {\n markSeen();\n drawFab();\n text.focus();\n } else if (v === \"help\") helpInput.focus();\n schedule(0);\n };\n\n /** A sent picture; once it has its height the chat stays at the bottom, if it was there. */\n const picture = (src: string, alt: string) => {\n const img = el(\"img\", { src, alt, loading: \"lazy\" });\n img.addEventListener(\"load\", () => {\n if (body.scrollHeight - body.scrollTop - body.clientHeight < img.clientHeight + 120) body.scrollTop = body.scrollHeight;\n });\n return img;\n };\n const bubble = (m: ChatMessage, isPending = false) => {\n const li = el(\"li\", { class: \"ckw-msg\", \"data-from\": m.from === \"visitor\" ? \"me\" : \"them\" }, m.body || !m.attachments?.length ? el(\"div\", { class: \"ckw-bubble\" }, m.body) : null);\n if (isPending) li.setAttribute(\"aria-busy\", \"true\");\n // Sent files: pictures as themselves, a PDF as a chip; each opens full size in a new tab.\n if (m.attachments?.length)\n li.append(\n el(\n \"div\",\n { class: \"ckw-msg-files\" },\n ...m.attachments.map((f) =>\n f.type.startsWith(\"image/\")\n ? el(\"a\", { class: \"ckw-msg-img\", href: fileUrl(f.id), target: \"_blank\", rel: \"noopener\", title: f.name }, picture(fileUrl(f.id), f.name))\n : el(\"a\", { class: \"ckw-msgr-cite\", href: fileUrl(f.id), target: \"_blank\", rel: \"noopener\" }, icon(I.doc, 14), el(\"span\", {}, f.name)),\n ),\n ),\n );\n for (const a of m.articles ?? []) {\n const chip = el(\"button\", { type: \"button\", class: \"ckw-msgr-cite\" }, icon(I.doc, 14), el(\"span\", {}, a.title));\n chip.addEventListener(\"click\", () => go({ article: a.id }));\n li.append(chip);\n }\n li.append(el(\"span\", { class: \"ckw-msg-meta\" }, `${m.from !== \"visitor\" ? `${whoLabel[m.from]} · ` : \"\"}${isPending ? \"Sending…\" : timeAgo(m.at)}`));\n return li;\n };\n\n const articleRow = (a: ArticleSummary) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-art\" }, el(\"span\", { class: \"ckw-msgr-art-t\" }, a.title), icon(I.next, 14));\n b.addEventListener(\"click\", () => go({ article: a.id }));\n return b;\n };\n /** A row in Help's lists: a bold name, two lines under it, a count, the arrow. */\n const helpRow = (name: string, sub: string, meta: string, act: () => void) => {\n const b = el(\n \"button\",\n { type: \"button\", class: \"ckw-msgr-hrow\" },\n el(\"span\", { class: \"ckw-msgr-hrow-main\" }, el(\"b\", {}, name), sub ? el(\"span\", { class: \"ckw-msgr-hrow-sub\" }, sub) : null, meta ? el(\"span\", { class: \"ckw-msgr-hrow-meta\" }, meta) : null),\n icon(I.next, 16),\n );\n b.addEventListener(\"click\", act);\n return b;\n };\n\n const searchBox = (placeholder = \"Search for help\") => {\n const wrap = el(\"label\", { class: \"ckw-msgr-search\" });\n const input = el(\"input\", { class: \"ckw-msgr-search-in\", type: \"search\", placeholder, \"aria-label\": \"Search for help\", maxlength: \"200\" });\n input.value = query;\n let t: ReturnType<typeof setTimeout> | undefined;\n input.addEventListener(\"input\", () => {\n query = input.value;\n clearTimeout(t);\n t = setTimeout(() => {\n if (view !== \"help\") return go(\"help\");\n void loadArticles(true);\n }, 250);\n });\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (view !== \"help\") go(\"help\");\n }\n });\n wrap.append(icon(I.search, 16), input);\n return wrap;\n };\n // Help's own field stays the same element between draws, so typing never loses the cursor.\n const helpSearch = searchBox(\"Search our help center…\");\n const helpInput = helpSearch.querySelector(\"input\")!;\n\n let loadingArticles = false;\n const loadArticles = async (force = false) => {\n if (!helpOn || (loadingArticles && !force)) return;\n loadingArticles = true;\n const q = query.trim();\n try {\n const r = await api().articles(q || undefined);\n if (q !== query.trim()) return;\n articles = r.articles;\n if (!q) hasArticles = r.articles.length > 0;\n } catch {\n articles = articles ?? [];\n } finally {\n loadingArticles = false;\n }\n draw();\n };\n // Home's \"Ask a question\" field: what is typed there opens the chat and is sent. The same element between draws, so\n // a read that redraws Home never takes the cursor or the words.\n const askForm = el(\"form\", { class: \"ckw-msgr-askq\" });\n const askIn = el(\"input\", { class: \"ckw-msgr-askq-in\", placeholder: \"Ask a question\", \"aria-label\": \"Ask a question\", maxlength: \"4000\", autocomplete: \"off\" });\n const askGo = el(\"button\", { type: \"submit\", class: \"ckw-msgr-send\", \"aria-label\": \"Send\", disabled: \"\" }, icon(I.up));\n askForm.append(askIn, askGo);\n askIn.addEventListener(\"input\", () => (askGo.disabled = !askIn.value.trim()));\n askForm.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (!askIn.value.trim()) return go(\"messages\");\n text.value = askIn.value;\n askIn.value = \"\";\n askGo.disabled = true;\n go(\"messages\");\n if (canSend()) void submit();\n });\n const drawHome = () => {\n // Two lines like Featurebase: \"Hi, Lukas 👋\" and the greeting in gray (without its own \"Hi!\", said above).\n const first = o.user()?.name?.trim().split(/\\s+/)[0];\n const rest = greeting.replace(/^(hi|hello|hey|hallo)( there)?\\s*[!,.]*\\s*/i, \"\").trim() || \"How can we help you today?\";\n const hero = el(\n \"h2\",\n { class: \"ckw-msgr-hero ckw-msgr-hello\" },\n el(\"span\", {}, first ? `Hi, ${first} ` : \"Hi there \", el(\"span\", { class: \"ckw-msgr-wave\", \"aria-hidden\": \"true\" }, \"👋\")),\n el(\"span\", { class: \"ckw-msgr-hello-sub\" }, rest),\n );\n const last = (thread?.messages ?? []).at(-1);\n const parts: HTMLElement[] = [hero, askForm];\n if (last) {\n const recent = el(\n \"button\",\n { type: \"button\", class: \"ckw-msgr-card ckw-msgr-recent\", \"aria-label\": `Recent message: ${lineOf(last)}` },\n el(\n \"span\",\n { class: \"ckw-msgr-recent-row\" },\n avatar(\"sm\"),\n el(\n \"span\",\n { class: \"ckw-msgr-card-main\" },\n el(\"span\", { class: \"ckw-msgr-card-sub ckw-msgr-recent-text\" }, lineOf(last)),\n el(\"span\", { class: \"ckw-msgr-card-meta\" }, `${last.from === \"visitor\" ? \"You\" : whoLabel[last.from]} · ${timeAgo(last.at)}`),\n ),\n unseen.length ? el(\"span\", { class: \"ckw-msgr-badge\" }, String(unseen.length)) : icon(I.next, 14),\n ),\n );\n recent.addEventListener(\"click\", () => go(\"messages\"));\n parts.push(recent);\n }\n // A few articles to tap; searching is the Help tab's, so Home fits without scrolling.\n if (helpOn && hasArticles !== false) {\n const helpCard = el(\"div\", { class: \"ckw-msgr-card ckw-msgr-card-col\" });\n const top = (articles ?? []).slice(0, 3);\n if (top.length) helpCard.append(...top.map(articleRow));\n else if (articles === null) helpCard.append(el(\"div\", { class: \"ckw-skel ckw-msgr-skel\" }));\n parts.push(helpCard);\n }\n body.replaceChildren(...parts);\n };\n\n const drawHelp = () => {\n if (helpInput.value !== query) helpInput.value = query;\n const q = query.trim();\n const all = articles ?? [];\n const groups = new Map<string, ArticleSummary[]>();\n for (const a of all) groups.set(a.collection, [...(groups.get(a.collection) ?? []), a]);\n const inside = !q && collection !== null ? (groups.get(collection) ?? []) : null;\n const heading = q ? \"Search results\" : inside ? (collection ?? \"\") : \"Most read articles\";\n const parts: HTMLElement[] = [el(\"h2\", { class: \"ckw-msgr-help-h\" }, heading), helpSearch];\n if (articles === null) parts.push(el(\"div\", { class: \"ckw-skel\" }));\n else if (!all.length) {\n const ask = el(\"button\", { type: \"button\", class: \"ckw-btn ckw-btn-primary\" }, \"Send us a message\");\n ask.addEventListener(\"click\", () => go(\"messages\"));\n parts.push(el(\"div\", { class: \"ckw-msgr-empty\" }, el(\"p\", {}, q ? `Nothing found for “${q}”.` : \"No help articles yet.\"), ask));\n } else if (q || inside)\n parts.push(\n el(\n \"div\",\n { class: \"ckw-msgr-hlist\" },\n // The excerpt often opens with the article's own heading; the row shows the title already.\n ...(inside ?? all).map((a) => helpRow(a.title, a.excerpt.startsWith(a.title) ? a.excerpt.slice(a.title.length).trim() : a.excerpt, q ? a.collection : \"\", () => go({ article: a.id }))),\n ),\n );\n else\n parts.push(\n el(\n \"div\",\n { class: \"ckw-msgr-hlist\" },\n ...[...groups].map(([name, items]) =>\n helpRow(name, items.map((a) => a.title).join(\", \"), `${items.length} ${items.length === 1 ? \"article\" : \"articles\"}`, () => {\n collection = name;\n go(\"help\");\n replay(body, \"ckw-msgr-enter\");\n }),\n ),\n ),\n );\n // The field stays in place (moving it would take its focus); only what is around it changes.\n if (body.childNodes[1] !== helpSearch) body.replaceChildren(...parts);\n else {\n (body.firstChild as HTMLElement).replaceWith(parts[0]);\n while (body.childNodes.length > 2) body.lastChild!.remove();\n body.append(...parts.slice(2));\n }\n };\n\n let articleShown: { id: string; node: HTMLElement } | null = null;\n const drawArticle = (id: string) => {\n if (articleShown?.id === id) return body.replaceChildren(articleShown.node);\n const node = el(\"article\", { class: \"ckw-msgr-doc\" }, el(\"div\", { class: \"ckw-skel\" }));\n articleShown = { id, node };\n body.replaceChildren(node);\n api()\n .article(id)\n .then((a) => {\n const foot = el(\"div\", { class: \"ckw-msgr-rate\" });\n const drawRate = () => {\n if (rated.has(id)) return foot.replaceChildren(el(\"span\", {}, \"Thanks for letting us know.\"));\n const yes = el(\"button\", { type: \"button\", class: \"ckw-btn\" }, \"Yes\");\n const no = el(\"button\", { type: \"button\", class: \"ckw-btn\" }, \"No\");\n const rate = (helpful: boolean) => {\n rated = new Set(rated).add(id);\n drawRate();\n api()\n .rateArticle(id, helpful)\n .catch(() => undefined);\n if (!helpful) go(\"messages\");\n };\n yes.addEventListener(\"click\", () => rate(true));\n no.addEventListener(\"click\", () => rate(false));\n foot.replaceChildren(el(\"span\", {}, \"Did this answer your question?\"), el(\"span\", { class: \"ckw-msgr-rate-b\" }, yes, no));\n };\n drawRate();\n const ask = el(\"button\", { type: \"button\", class: \"ckw-btn ckw-msgr-ask\" }, icon(I.chat), \"Still need help? Send us a message\");\n ask.addEventListener(\"click\", () => go(\"messages\"));\n node.replaceChildren(\n el(\"p\", { class: \"ckw-msgr-doc-c\" }, a.collection),\n el(\"h2\", { class: \"ckw-msgr-doc-t\" }, a.title),\n el(\"p\", { class: \"ckw-msgr-doc-c\" }, `Updated ${timeAgo(a.updatedAt)}`),\n el(\"div\", { class: \"ckw-msgr-doc-b\" }, ...a.blocks.map(blockOf)),\n foot,\n ask,\n );\n })\n .catch((e: Error) => {\n articleShown = null;\n node.replaceChildren(el(\"p\", { class: \"ckw-msgr-error\" }, e.message));\n });\n };\n\n let drawn = -1;\n /** What the list shows, so a read that brings nothing new leaves it alone (no flicker, links stay where they are). */\n let listSig = \"\";\n /** How many bubbles the list had: the ones after it are new and glide in. */\n let listCount = -1;\n const suggestions = el(\"div\", { class: \"ckw-msgr-sugg\" });\n const drawMessages = () => {\n const msgs = thread?.messages ?? [];\n const parts: HTMLElement[] = [];\n if (!loaded) parts.push(el(\"div\", { class: \"ckw-skel\" }));\n else {\n const sig = `${msgs.map((m) => m.id).join(\",\")}|${pending ? `${pending.body}+${pending.attachments?.length ?? 0}` : \"\"}|${Math.floor(Date.now() / 60_000)}`;\n if (sig !== listSig) {\n listSig = sig;\n const greet = el(\"li\", { class: \"ckw-msg\", \"data-from\": \"them\" }, el(\"div\", { class: \"ckw-bubble\" }, greeting));\n const items = [greet, ...msgs.map((m) => bubble(m)), ...(pending ? [bubble(pending, true)] : [])];\n if (listCount >= 0) items.slice(listCount).forEach((li) => li.setAttribute(\"data-new\", \"\"));\n listCount = items.length;\n list.replaceChildren(...items);\n }\n parts.push(list);\n // Before the visitor wrote: the most read articles as answers to tap.\n const top = !msgs.some((m) => m.from === \"visitor\") && !pending ? (articles ?? []).slice(0, 3) : [];\n if (top.length) {\n if (suggestions.childNodes.length !== top.length)\n suggestions.replaceChildren(\n ...top.map((a) => {\n const b = el(\"button\", { type: \"button\", class: \"ckw-msgr-sugg-b\" }, a.title);\n b.addEventListener(\"click\", () => go({ article: a.id }));\n return b;\n }),\n );\n parts.push(suggestions);\n }\n }\n if (thread?.conversation?.status === \"solved\" && !pending) parts.push(el(\"p\", { class: \"ckw-fine ckw-msgr-note\" }, \"This conversation is closed. Write to start a new one.\"));\n if (body.childNodes.length !== parts.length || parts.some((x, i) => body.childNodes[i] !== x)) body.replaceChildren(...parts);\n const count = msgs.length + (pending ? 1 : 0);\n if (count !== drawn) {\n drawn = count;\n body.scrollTop = body.scrollHeight;\n }\n err.textContent = error;\n if (error && !err.isConnected) form.prepend(err);\n else if (!error) err.remove();\n if (needEmail()) {\n if (emailOk()) email.removeAttribute(\"aria-invalid\");\n else email.setAttribute(\"aria-invalid\", \"true\");\n if (!email.isConnected) form.insertBefore(email, tray.isConnected ? tray : row);\n } else email.remove();\n drawTray();\n send.disabled = !canSend();\n };\n\n const draw = () => {\n if (!open) return;\n pop.dataset.view = typeof view === \"string\" ? view : \"article\";\n drawBar();\n if (view === \"home\") drawHome();\n else if (view === \"messages\") drawMessages();\n else if (view === \"help\") drawHelp();\n else drawArticle(view.article);\n const kids: HTMLElement[] = view === \"home\" ? [sky, bar, body] : [bar, body];\n kids.push(view === \"messages\" ? form : tabs);\n if (o.branding !== false) kids.push(brand);\n if (menu.isConnected) kids.push(menu);\n if (pop.childNodes.length !== kids.length || kids.some((k, i) => pop.childNodes[i] !== k)) pop.replaceChildren(...kids);\n };\n\n // ---------- Reading the chat ----------\n const tick = async () => {\n ctrl?.abort();\n ctrl = new AbortController();\n try {\n take(await api().chat(ctrl.signal));\n error = \"\";\n } catch (e) {\n if ((e as Error).name === \"AbortError\") return;\n if (open && view === \"messages\") error = (e as Error).message;\n }\n loaded = true;\n draw();\n drawFab();\n schedule();\n };\n /** The next read: often while the chat is on screen, now and then while the visitor waits for an answer. */\n function schedule(now?: number) {\n clearTimeout(poll);\n const waiting = !!thread?.messages.some((m) => m.from === \"visitor\") && thread?.conversation?.status !== \"solved\";\n const wrote = (thread?.messages ?? []).filter((m) => m.from === \"visitor\").at(-1)?.at;\n const recent = !!wrote && Date.now() - new Date(wrote).getTime() < WAITING_FOR_MS;\n const ms = now ?? (watching() ? POLL_OPEN_MS : waiting && recent ? POLL_WAITING_MS : open || waiting ? POLL_IDLE_MS : 0);\n if (ms || now === 0) poll = setTimeout(() => void tick(), ms);\n }\n const onVisible = () => {\n if (document.visibilityState === \"visible\") schedule(0);\n else clearTimeout(poll);\n };\n document.addEventListener(\"visibilitychange\", onVisible);\n\n const submit = async () => {\n const msg = text.value.trim();\n const files = picked;\n if ((!msg && !files.length) || pending || !emailOk()) return;\n chime.unlock();\n for (const p of files) localUrls.set(p.key, p.local);\n pending = {\n id: \"pending\",\n from: \"visitor\",\n body: msg,\n at: new Date().toISOString(),\n ...(files.length ? { attachments: files.map((p) => ({ id: p.key, name: p.name, type: p.type, size: p.size })) } : {}),\n };\n text.value = \"\";\n picked = [];\n error = \"\";\n draw();\n // Send waits for the uploads; one that failed is left out and said in the error line.\n await Promise.all(files.map((p) => p.up));\n const ids = files.filter((p) => p.id).map((p) => p.id!);\n let sent = false;\n try {\n if (!msg && !ids.length) throw new Error(error || \"The file could not be sent.\");\n take(\n await api().sendChat({\n body: msg,\n email: needEmail() && email.value.trim() ? email.value.trim() : undefined,\n url: window.location.href.slice(0, 500),\n ...(ids.length ? { attachments: ids } : {}),\n // A little context for a bug report; the server reads browser and system from the user agent.\n context: { viewport: `${window.innerWidth}×${window.innerHeight}` },\n }),\n );\n sent = true;\n } catch (e) {\n text.value = msg;\n picked = files.filter((p) => p.id);\n error = (e as Error).message;\n }\n pending = null;\n for (const p of files) localUrls.delete(p.key);\n draw();\n if (sent) for (const p of files) URL.revokeObjectURL(p.local);\n schedule();\n };\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n void submit();\n });\n text.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.isComposing) {\n e.preventDefault();\n void submit();\n }\n });\n text.addEventListener(\"input\", () => (send.disabled = !canSend()));\n // A picture on the clipboard (a screenshot) attaches when pasted into the field.\n text.addEventListener(\"paste\", (e) => {\n const fs = [...(e.clipboardData?.files ?? [])];\n if (!fs.length) return;\n e.preventDefault();\n addFiles(fs);\n });\n // Files dropped anywhere on the panel attach (and open the chat).\n const hasFiles = (e: DragEvent) => !!e.dataTransfer && [...e.dataTransfer.types].includes(\"Files\");\n pop.addEventListener(\"dragover\", (e) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n pop.setAttribute(\"data-drop\", \"\");\n });\n pop.addEventListener(\"dragleave\", (e) => {\n if (!e.relatedTarget || !pop.contains(e.relatedTarget as Node)) pop.removeAttribute(\"data-drop\");\n });\n pop.addEventListener(\"drop\", (e) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n pop.removeAttribute(\"data-drop\");\n addFiles([...(e.dataTransfer?.files ?? [])]);\n });\n email.addEventListener(\"input\", () => draw());\n\n function show(v: MessengerView | { article: string } = \"home\", still = false) {\n const was = open;\n open = true;\n view = v === \"help\" && !helpOn ? \"home\" : v;\n drawn = -1;\n previewGone = true;\n hideTeaser(true);\n pop.toggleAttribute(\"data-still\", still);\n enter(pop);\n if (was) replay(body, \"ckw-msgr-enter\");\n if (articles === null || (view === \"help\" && query)) void loadArticles();\n draw();\n drawFab();\n if (view === \"messages\") {\n markSeen();\n text.focus();\n }\n schedule(0);\n }\n function close() {\n if (!open) return;\n open = false;\n if (menu.isConnected) closeMenu();\n leave(pop, 200);\n drawFab();\n schedule();\n if (launcherOn) fab.focus();\n }\n pop.addEventListener(\"click\", () => amenuOpen() && closeAmenu());\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || !open) return;\n if (amenuOpen()) {\n closeAmenu();\n clip.focus();\n } else if (menuOpen()) {\n closeMenu();\n menuBtn.focus();\n } else close();\n };\n document.addEventListener(\"keydown\", onKey);\n\n // One read on load (the count and preview of answers not seen yet), and the article count for the Help tab.\n void tick();\n if (helpOn) void loadArticles();\n drawFab();\n if (o.opened) show(o.opened, true);\n\n return {\n open: (v) => show(v ?? \"home\"),\n close,\n toggle: () => (open ? close() : show()),\n destroy: () => {\n clearTimeout(poll);\n clearTimeout(teaserTimer);\n for (const t of leaving.values()) clearTimeout(t);\n ctrl?.abort();\n for (const p of picked) forget(p);\n for (const u of localUrls.values()) URL.revokeObjectURL(u);\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"visibilitychange\", onVisible);\n root.remove();\n },\n };\n};\n"],"mappings":"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","names":["list"]}
|