@mailoo/chat 0.0.0-stage → 1.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +16 -0
- package/README.md +152 -2
- package/dist/chat-message-Dw6tKBEb.d.cts +10 -0
- package/dist/chat-message-Dw6tKBEb.d.ts +10 -0
- package/dist/chunk-2Y37RYEL.js +141 -0
- package/dist/chunk-2Y37RYEL.js.map +1 -0
- package/dist/chunk-4TNHJERE.js +19 -0
- package/dist/chunk-4TNHJERE.js.map +1 -0
- package/dist/chunk-77E6HUHY.js +41 -0
- package/dist/chunk-77E6HUHY.js.map +1 -0
- package/dist/chunk-AU6EFFLV.js +431 -0
- package/dist/chunk-AU6EFFLV.js.map +1 -0
- package/dist/chunk-QZ7HWQDO.js +839 -0
- package/dist/chunk-QZ7HWQDO.js.map +1 -0
- package/dist/client/index.cjs +1658 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +33 -0
- package/dist/client/index.d.ts +33 -0
- package/dist/client/index.js +597 -0
- package/dist/client/index.js.map +1 -0
- package/dist/hooks/index.cjs +751 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +79 -0
- package/dist/hooks/index.d.ts +79 -0
- package/dist/hooks/index.js +32 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +213 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +53 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/mailoo-site-chat-widget-C7B797Lu.d.ts +130 -0
- package/dist/mailoo-site-chat-widget-h_cBqsJw.d.cts +130 -0
- package/dist/routes/index.cjs +204 -0
- package/dist/routes/index.cjs.map +1 -0
- package/dist/routes/index.d.cts +30 -0
- package/dist/routes/index.d.ts +30 -0
- package/dist/routes/index.js +174 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/shared-glVmghqk.d.cts +40 -0
- package/dist/shared-glVmghqk.d.ts +40 -0
- package/dist/styles/widget.css +122 -0
- package/dist/welcome-presets/index.cjs +479 -0
- package/dist/welcome-presets/index.cjs.map +1 -0
- package/dist/welcome-presets/index.d.cts +53 -0
- package/dist/welcome-presets/index.d.ts +53 -0
- package/dist/welcome-presets/index.js +38 -0
- package/dist/welcome-presets/index.js.map +1 -0
- package/dist/welcome-presets/parse.cjs +44 -0
- package/dist/welcome-presets/parse.cjs.map +1 -0
- package/dist/welcome-presets/parse.d.cts +11 -0
- package/dist/welcome-presets/parse.d.ts +11 -0
- package/dist/welcome-presets/parse.js +9 -0
- package/dist/welcome-presets/parse.js.map +1 -0
- package/dist/widget-config-B5Tf7gqn.d.cts +32 -0
- package/dist/widget-config-B5Tf7gqn.d.ts +32 -0
- package/package.json +85 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/mailoo-site-chat-widget.tsx","../../src/components/mailoo-chat-unavailable-panel.tsx","../../src/components/mailoo-site-chat-shell.tsx"],"sourcesContent":["'use client'\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport {\n ChatBubbleLeftRightIcon,\n ChevronLeftIcon,\n ChevronUpIcon,\n InformationCircleIcon,\n XMarkIcon,\n} from '@heroicons/react/24/outline'\nimport {\n useMailooChatSession,\n type MailooChatFault,\n} from '../hooks/index.js'\nimport {\n defaultChatUiLabels,\n type MailooChatUiLabels,\n} from '../lib/guest-copy.js'\nimport {\n chatWidgetCssVariables,\n mailooChatLauncherRootClassNames,\n resolveMailooChatLauncherPosition,\n type MailooChatLauncherPosition,\n type MailooChatWidgetConfig,\n} from '../lib/widget-config.js'\nimport {\n MailooChatUnavailablePanel,\n type MailooChatUnavailableAction,\n type MailooChatUnavailableRenderArgs,\n} from './mailoo-chat-unavailable-panel.js'\n\nexport type { MailooChatMessage } from '../lib/chat-message.js'\nexport type { MailooChatUiLabels }\nexport type { MailooChatWidgetConfig, MailooChatLauncherPosition }\nexport type {\n MailooChatUnavailableAction,\n MailooChatUnavailableRenderArgs,\n}\nexport type { MailooChatFault }\n\nexport type MailooChatWidgetProps = {\n apiOrigin: string\n projectUid: string\n integrationId: string\n welcomeMessage: string\n locale: string\n isAuthenticated: boolean\n widgetConfig?: MailooChatWidgetConfig | null\n className?: string\n panelClassName?: string\n launcherClassName?: string\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n title?: string\n launcherLabel?: string\n labels?: Partial<MailooChatUiLabels>\n submitEndpoint?: string\n messagesEndpoint?: string\n pollIntervalMs?: number\n enablePolling?: boolean\n enableWebSocket?: boolean\n position?: MailooChatLauncherPosition\n zIndex?: number\n onSessionCreated?: (sessionPublicId: string) => void\n onMessageSent?: (content: string) => void\n onError?: (error: string) => void\n onFault?: (fault: MailooChatFault) => void\n /** Integrator-chosen contact/link when chat is rate-limited or unavailable. */\n unavailableAction?: MailooChatUnavailableAction\n renderLauncher?: (args: { open: boolean; toggle: () => void }) => ReactNode\n renderHeader?: (args: { welcomeMessage: string; title: string }) => ReactNode\n renderEmpty?: (args: { isAuthenticated: boolean }) => ReactNode\n renderWelcome?: (args: MailooChatWelcomeRenderArgs) => ReactNode\n /** Replace the built-in unavailable panel; package still classifies the fault. */\n renderUnavailable?: (args: MailooChatUnavailableRenderArgs) => ReactNode\n}\n\nexport type MailooChatWelcomeRenderArgs = {\n widgetConfig: MailooChatWidgetConfig | null | undefined\n welcomeMessage: string\n title: string\n locale: string\n labels: MailooChatUiLabels\n brandBtnClass: string\n brandStyle?: React.CSSProperties\n topics: MailooChatWidgetConfig['topics']\n selectedTopicId: string | null\n setSelectedTopicId: (id: string | null) => void\n /** When false, identity comes from session / saved guest profile — no email form. */\n needsGuestFields: boolean\n isAuthenticated: boolean\n guestEmail: string\n setGuestEmail: (value: string) => void\n guestName: string\n setGuestName: (value: string) => void\n error: string | null\n /** Continue from welcome: validates guest email when needed, then enters composer. */\n confirmGuestContact: (invalidEmailMessage?: string) => boolean\n}\n\nexport function MailooSiteChatWidget(props: MailooChatWidgetProps) {\n const {\n apiOrigin,\n projectUid,\n integrationId,\n welcomeMessage,\n locale,\n isAuthenticated,\n widgetConfig,\n className,\n panelClassName,\n launcherClassName,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n title: titleProp,\n launcherLabel,\n labels: labelsProp,\n submitEndpoint,\n messagesEndpoint,\n pollIntervalMs,\n enablePolling,\n enableWebSocket,\n position: positionProp,\n zIndex,\n onSessionCreated,\n onMessageSent,\n onError,\n onFault,\n unavailableAction,\n renderLauncher,\n renderHeader,\n renderEmpty,\n renderWelcome,\n renderUnavailable,\n } = props\n\n const t: MailooChatUiLabels = {\n ...defaultChatUiLabels(locale),\n ...labelsProp,\n }\n const title = titleProp ?? t.title\n\n const isControlled = openProp !== undefined\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen)\n const open = isControlled ? openProp : uncontrolledOpen\n const setOpen = (next: boolean) => {\n onOpenChange?.(next)\n if (!isControlled) setUncontrolledOpen(next)\n }\n\n const [input, setInput] = useState('')\n const [threadHintExpanded, setThreadHintExpanded] = useState(false)\n const [selectedTopicId, setSelectedTopicId] = useState<string | null>(null)\n /** Welcome dismissed via Continue; independent of auth / guestContactOk. */\n const [welcomeDone, setWelcomeDone] = useState(false)\n const messagesScrollRef = useRef<HTMLDivElement | null>(null)\n /** When true, new messages pin the pane to the bottom. Cleared when user scrolls up. */\n const stickToBottomRef = useRef(true)\n const SCROLL_NEAR_BOTTOM_PX = 80\n\n const brandStyle = chatWidgetCssVariables(widgetConfig ?? undefined)\n const brandBtn =\n 'rounded bg-[var(--mailoo-chat-brand,#2563eb)] text-[var(--mailoo-chat-brand-on,#ffffff)] hover:opacity-90'\n const headerTitle = widgetConfig?.welcomeTitle ?? title\n const headerTagline = widgetConfig?.welcomeTagline ?? welcomeMessage\n const topics = widgetConfig?.topics ?? []\n const anyOperatorOnline = (widgetConfig?.operators ?? []).some(\n (op) => op.online\n )\n\n const session = useMailooChatSession({\n apiOrigin,\n projectUid,\n integrationId,\n isAuthenticated,\n submitEndpoint,\n messagesEndpoint,\n pollIntervalMs,\n enablePolling,\n enableWebSocket,\n enabled: open,\n onSessionCreated,\n onMessageSent,\n onError,\n onFault,\n })\n\n const {\n messages,\n sending,\n error,\n fault,\n retryAfterFault,\n guestEmail,\n guestName,\n setGuestEmail,\n setGuestName,\n guestContactOk,\n guestProfileHydrated,\n confirmGuestContact,\n resetGuestContact,\n canCompose,\n sendMessage,\n } = session\n\n const onMessagesScroll = useCallback(() => {\n const el = messagesScrollRef.current\n if (!el) return\n const distanceFromBottom =\n el.scrollHeight - el.scrollTop - el.clientHeight\n stickToBottomRef.current = distanceFromBottom <= SCROLL_NEAR_BOTTOM_PX\n }, [])\n\n useEffect(() => {\n if (!stickToBottomRef.current) return\n const el = messagesScrollRef.current\n if (!el) return\n el.scrollTop = el.scrollHeight\n }, [messages])\n\n const send = async () => {\n const text = input.trim()\n if (!text || sending) return\n stickToBottomRef.current = true\n const ok = await sendMessage(text, {\n invalidEmailMessage: t.emailInvalid,\n topicId: selectedTopicId ?? undefined,\n })\n if (ok) setInput('')\n }\n\n const toggle = () => setOpen(!open)\n const position = resolveMailooChatLauncherPosition(\n positionProp,\n widgetConfig\n )\n\n const needsGuestFields = !isAuthenticated && !guestContactOk\n const showUnavailable = fault != null\n const showEntry =\n !showUnavailable &&\n guestProfileHydrated &&\n messages.length === 0 &&\n !welcomeDone\n const showWelcomeSkin = showEntry && renderWelcome != null\n const showBuiltinEntry = showEntry && renderWelcome == null\n const showComposer =\n !showUnavailable &&\n (welcomeDone || messages.length > 0) &&\n canCompose\n const showDefaultHeader = !showWelcomeSkin || showUnavailable\n\n const unavailableArgs: MailooChatUnavailableRenderArgs | null = fault\n ? {\n fault,\n labels: t,\n retry: retryAfterFault,\n unavailableAction,\n brandBtnClass: brandBtn,\n }\n : null\n\n const enterFromWelcome = (invalidEmailMessage?: string): boolean => {\n if (isAuthenticated || guestContactOk) {\n setWelcomeDone(true)\n return true\n }\n const ok = confirmGuestContact(invalidEmailMessage)\n if (ok) setWelcomeDone(true)\n return ok\n }\n\n const onResetGuestContact = () => {\n setWelcomeDone(false)\n resetGuestContact()\n }\n\n const backToTopics = () => {\n setWelcomeDone(false)\n setThreadHintExpanded(false)\n }\n\n const canReturnToTopics = welcomeDone && !showUnavailable\n\n const welcomeArgs: MailooChatWelcomeRenderArgs = {\n widgetConfig,\n welcomeMessage: headerTagline,\n title: headerTitle,\n locale,\n labels: t,\n brandBtnClass: brandBtn,\n brandStyle,\n topics,\n selectedTopicId,\n setSelectedTopicId,\n needsGuestFields,\n isAuthenticated,\n guestEmail,\n setGuestEmail,\n guestName,\n setGuestName,\n error,\n confirmGuestContact: enterFromWelcome,\n }\n\n const rootClass = [\n mailooChatLauncherRootClassNames(position),\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div\n className={rootClass}\n data-clarity-mask=\"true\"\n style={{\n ...brandStyle,\n ...(zIndex != null ? { zIndex } : {}),\n }}\n >\n {open && (\n <div\n className={`mailoo-chat-panel ${panelClassName ?? ''}`}\n style={brandStyle}\n >\n {showDefaultHeader &&\n (renderHeader ? (\n renderHeader({\n welcomeMessage: headerTagline,\n title: headerTitle,\n })\n ) : (\n <div className=\"flex items-start gap-1 border-b border-gray-200 px-2 py-2 dark:border-gray-700\">\n {canReturnToTopics ? (\n <button\n type=\"button\"\n onClick={backToTopics}\n className=\"mt-0.5 shrink-0 rounded p-1 text-gray-500 hover:bg-gray-100 hover:text-gray-800 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n aria-label={t.backToTopics}\n title={t.backToTopics}\n >\n <ChevronLeftIcon className=\"h-5 w-5\" aria-hidden />\n </button>\n ) : null}\n <div className=\"min-w-0 flex-1 px-1\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {headerTitle}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {headerTagline}\n </p>\n </div>\n </div>\n ))}\n\n {!isAuthenticated && !guestProfileHydrated && !showUnavailable && (\n <p className=\"border-b border-gray-200 p-3 text-sm text-gray-500 dark:border-gray-700 dark:text-gray-400\">\n {t.loadingProfile}\n </p>\n )}\n\n {showUnavailable && unavailableArgs ? (\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n {messages.length > 0 ? (\n <div className=\"min-h-0 max-h-[40%] space-y-2 overflow-y-auto border-b border-gray-200 p-3 text-sm dark:border-gray-700\">\n {messages.map((m) => (\n <div\n key={m.id}\n className={\n m.messageType === 'OUTBOUND'\n ? 'mailoo-chat-bubble--outbound ml-6 rounded-md p-2'\n : 'mailoo-chat-bubble--inbound mr-6 rounded-md p-2'\n }\n >\n <p className=\"whitespace-pre-wrap text-gray-900 dark:text-gray-100\">\n {m.content}\n </p>\n </div>\n ))}\n </div>\n ) : null}\n {renderUnavailable\n ? renderUnavailable(unavailableArgs)\n : MailooChatUnavailablePanel(unavailableArgs)}\n </div>\n ) : null}\n\n {showWelcomeSkin && (\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n {renderWelcome(welcomeArgs)}\n </div>\n )}\n\n {showBuiltinEntry && (\n <div className=\"space-y-3 border-b border-gray-200 p-3 text-sm dark:border-gray-700\">\n {topics.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {topics.map((topic) =>\n topic.action === 'external_url' && topic.externalUrl ? (\n <a\n key={topic.id}\n href={topic.externalUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`px-2 py-1 text-xs font-medium ${brandBtn}`}\n >\n {topic.label}\n </a>\n ) : (\n <button\n key={topic.id}\n type=\"button\"\n onClick={() =>\n setSelectedTopicId((prev) =>\n prev === topic.id ? null : topic.id\n )\n }\n className={`px-2 py-1 text-xs font-medium ${\n selectedTopicId === topic.id\n ? brandBtn\n : 'rounded border border-gray-300 text-gray-700 dark:border-gray-600 dark:text-gray-200'\n }`}\n >\n {topic.label}\n </button>\n )\n )}\n </div>\n )}\n {needsGuestFields && (\n <>\n <p className=\"text-gray-700 dark:text-gray-300\">{t.intro}</p>\n <div>\n <label\n htmlFor=\"mailoo-chat-guest-email\"\n className=\"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400\"\n >\n {t.emailLabel}\n </label>\n <input\n id=\"mailoo-chat-guest-email\"\n type=\"email\"\n autoComplete=\"email\"\n value={guestEmail}\n onChange={(e) => setGuestEmail(e.target.value)}\n placeholder={t.emailPlaceholder}\n className=\"w-full rounded border border-gray-300 bg-white px-2 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-800\"\n />\n </div>\n <div>\n <label\n htmlFor=\"mailoo-chat-guest-name\"\n className=\"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400\"\n >\n {t.nameLabel}\n </label>\n <input\n id=\"mailoo-chat-guest-name\"\n type=\"text\"\n autoComplete=\"name\"\n value={guestName}\n onChange={(e) => setGuestName(e.target.value)}\n placeholder={t.namePlaceholder}\n className=\"w-full rounded border border-gray-300 bg-white px-2 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-800\"\n />\n </div>\n {error && (\n <p className=\"text-xs text-red-600 dark:text-red-400\">\n {error}\n </p>\n )}\n </>\n )}\n <button\n type=\"button\"\n onClick={() => enterFromWelcome(t.emailInvalid)}\n className={`w-full py-2 text-sm font-medium ${brandBtn}`}\n >\n {t.continueCta}\n </button>\n </div>\n )}\n\n {showComposer && (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n {!isAuthenticated && (\n <>\n <div className=\"flex shrink-0 items-center justify-between gap-2 border-b border-gray-100 px-3 py-1.5 text-[11px] text-gray-500 dark:border-gray-800 dark:text-gray-400\">\n <span className=\"truncate\">{guestEmail}</span>\n <button\n type=\"button\"\n onClick={() => onResetGuestContact()}\n className=\"shrink-0 text-[var(--mailoo-chat-brand,#2563eb)] hover:underline\"\n >\n {t.changeContact}\n </button>\n </div>\n {threadHintExpanded && (\n <div className=\"shrink-0 border-b border-gray-100 px-3 py-2 dark:border-gray-800\">\n <div className=\"flex items-start gap-2\">\n <p className=\"min-w-0 flex-1 text-[11px] leading-snug text-gray-500 dark:text-gray-400\">\n {t.threadHint}\n </p>\n <button\n type=\"button\"\n onClick={() => setThreadHintExpanded(false)}\n className=\"shrink-0 rounded p-0.5 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n aria-label={t.threadHintCollapse}\n title={t.threadHintCollapse}\n >\n <ChevronUpIcon className=\"h-4 w-4\" aria-hidden />\n </button>\n </div>\n </div>\n )}\n </>\n )}\n <div className=\"relative min-h-0 w-full min-w-0 flex-1\">\n {!isAuthenticated && !threadHintExpanded && (\n <button\n type=\"button\"\n onClick={() => setThreadHintExpanded(true)}\n className=\"absolute right-3 top-2 z-20 rounded-full bg-white/95 p-1 shadow-md ring-1 ring-gray-200/80 hover:bg-gray-50 dark:bg-gray-800/95 dark:ring-gray-600 dark:hover:bg-gray-700\"\n aria-expanded={false}\n aria-label={t.threadHintIconLabel}\n title={t.threadHintIconLabel}\n >\n <InformationCircleIcon\n className=\"h-5 w-5 text-gray-600 dark:text-gray-300\"\n aria-hidden\n />\n </button>\n )}\n <div\n ref={messagesScrollRef}\n onScroll={onMessagesScroll}\n className={`h-full min-h-0 space-y-2 overflow-y-auto p-3 text-sm ${\n !isAuthenticated && !threadHintExpanded ? 'pr-12 pt-2' : ''\n }`}\n >\n {messages.length === 0 &&\n (renderEmpty ? (\n renderEmpty({ isAuthenticated })\n ) : (\n <p className=\"text-gray-500 dark:text-gray-400\">\n {isAuthenticated\n ? t.emptyThreadAuthenticated\n : t.emptyThreadGuest}\n </p>\n ))}\n {messages.map((m) => (\n <div\n key={m.id}\n className={\n m.messageType === 'OUTBOUND'\n ? 'mailoo-chat-bubble--outbound ml-6 rounded-md p-2'\n : 'mailoo-chat-bubble--inbound mr-6 rounded-md p-2'\n }\n >\n <p className=\"whitespace-pre-wrap text-gray-900 dark:text-gray-100\">\n {m.content}\n </p>\n <p className=\"mt-1 text-[10px] text-gray-400\">\n {new Date(m.createdAt).toLocaleString()}\n </p>\n </div>\n ))}\n </div>\n </div>\n {error && guestContactOk && (\n <p className=\"px-3 text-xs text-red-600 dark:text-red-400\">\n {error}\n </p>\n )}\n {widgetConfig?.privacyPolicyUrl && (\n <p className=\"px-3 pb-1 text-[10px] text-gray-500 dark:text-gray-400\">\n <a\n href={widgetConfig.privacyPolicyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline hover:text-gray-700 dark:hover:text-gray-300\"\n >\n Privacy\n </a>\n </p>\n )}\n <div className=\"flex shrink-0 gap-2 border-t border-gray-200 p-2 dark:border-gray-700\">\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') void send()\n }}\n placeholder={t.composerPlaceholder}\n className=\"min-w-0 flex-1 rounded border border-gray-300 bg-white px-2 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-800\"\n />\n <button\n type=\"button\"\n onClick={() => void send()}\n disabled={sending}\n className={`px-3 py-1.5 text-sm font-medium disabled:opacity-50 ${brandBtn}`}\n >\n {t.send}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n {renderLauncher ? (\n renderLauncher({ open, toggle })\n ) : (\n <button\n type=\"button\"\n onClick={toggle}\n className={`mailoo-chat-launcher ${launcherClassName ?? ''}`}\n aria-label={\n open ? t.launcherClose : (launcherLabel ?? t.launcherOpen)\n }\n >\n {open ? (\n <XMarkIcon className=\"mailoo-chat-launcher__icon\" aria-hidden />\n ) : (\n <ChatBubbleLeftRightIcon\n className=\"mailoo-chat-launcher__icon\"\n aria-hidden\n />\n )}\n {!open && anyOperatorOnline ? (\n <span className=\"mailoo-chat-launcher__online\" aria-hidden />\n ) : null}\n </button>\n )}\n </div>\n )\n}\n","'use client'\n\nimport type { ReactNode } from 'react'\nimport type { MailooChatFault } from '../hooks/shared.js'\nimport type { MailooChatUiLabels } from '../lib/guest-copy.js'\n\nexport type MailooChatUnavailableAction =\n | { type: 'link'; href: string; label: string }\n | { type: 'mailto'; email: string; label?: string }\n\nexport type MailooChatUnavailableRenderArgs = {\n fault: MailooChatFault\n labels: MailooChatUiLabels\n retry: () => void\n unavailableAction?: MailooChatUnavailableAction\n brandBtnClass: string\n}\n\nfunction actionHref(action: MailooChatUnavailableAction): string {\n if (action.type === 'mailto') {\n return `mailto:${action.email.trim()}`\n }\n return action.href\n}\n\nfunction actionLabel(\n action: MailooChatUnavailableAction,\n labels: MailooChatUiLabels\n): string {\n if (action.type === 'mailto') {\n return action.label?.trim() || labels.contactCta\n }\n return action.label\n}\n\n/**\n * Built-in panel when chat hits rate limit or service/network unavailability.\n * Integrators may replace this via `renderUnavailable`.\n */\nexport function MailooChatUnavailablePanel({\n fault,\n labels,\n retry,\n unavailableAction,\n brandBtnClass,\n}: MailooChatUnavailableRenderArgs): ReactNode {\n const isRateLimited = fault.kind === 'rate_limited'\n const title = isRateLimited\n ? labels.rateLimitedTitle\n : labels.unavailableTitle\n const body = isRateLimited\n ? labels.rateLimitedBody\n : labels.unavailableBody\n\n return (\n <div\n className=\"flex min-h-0 flex-1 flex-col justify-center gap-3 p-4 text-sm\"\n role=\"alert\"\n >\n <div className=\"space-y-1\">\n <p className=\"font-medium text-gray-900 dark:text-white\">{title}</p>\n <p className=\"text-xs leading-snug text-gray-600 dark:text-gray-300\">\n {body}\n </p>\n </div>\n <div className=\"flex flex-col gap-2\">\n <button\n type=\"button\"\n onClick={retry}\n className={`w-full py-2 text-sm font-medium ${brandBtnClass}`}\n >\n {labels.retryCta}\n </button>\n {unavailableAction ? (\n <a\n href={actionHref(unavailableAction)}\n {...(unavailableAction.type === 'link'\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n className=\"w-full rounded border border-gray-300 py-2 text-center text-sm font-medium text-gray-800 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-100 dark:hover:bg-gray-800\"\n >\n {actionLabel(unavailableAction, labels)}\n </a>\n ) : null}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport type { MailooChatHostConfig } from '../config.js'\nimport type { MailooChatFault } from '../hooks/shared.js'\nimport {\n MailooSiteChatWidget,\n type MailooChatUnavailableAction,\n type MailooChatUnavailableRenderArgs,\n} from './mailoo-site-chat-widget.js'\nimport {\n createMailooChatWelcomePresetRenderer,\n mailooChatWelcomePresetPanelClassName,\n useOptionalMailooChatWelcomePreset,\n} from '../welcome-presets/index.js'\n\n/** Dispatched by Support Live Chat (and other CTAs) to open the floating widget. */\nexport const MAILOO_SITE_CHAT_OPEN_EVENT = 'mailoo-site-chat:open'\n\nexport type MailooSiteChatShellConfig = MailooChatHostConfig\n\nexport type MailooSiteChatShellProps = {\n chat: MailooSiteChatShellConfig\n unavailableAction?: MailooChatUnavailableAction\n renderUnavailable?: (args: MailooChatUnavailableRenderArgs) => ReactNode\n onError?: (error: string) => void\n onFault?: (fault: MailooChatFault) => void\n}\n\n/**\n * Default floating site chat host. Always passes `widgetConfig` from\n * {@link resolveMailooChatHostConfig}. Open state is controlled here; CTAs call\n * {@link openMailooSiteChat}. When wrapped in\n * {@link MailooChatWelcomePresetProvider}, uses the active welcome preset.\n * Pass `unavailableAction` / `renderUnavailable` so rate-limit and service\n * faults show a contact path chosen by the integrator.\n */\nexport function MailooSiteChatShell({\n chat,\n unavailableAction,\n renderUnavailable,\n onError,\n onFault,\n}: Readonly<MailooSiteChatShellProps>) {\n const welcomePreset = useOptionalMailooChatWelcomePreset()\n const [open, setOpen] = useState(false)\n const openChat = useCallback(() => setOpen(true), [])\n\n useEffect(() => {\n const onOpen = () => openChat()\n window.addEventListener(MAILOO_SITE_CHAT_OPEN_EVENT, onOpen)\n return () => {\n window.removeEventListener(MAILOO_SITE_CHAT_OPEN_EVENT, onOpen)\n }\n }, [openChat])\n\n const renderWelcome = useMemo(\n () =>\n welcomePreset\n ? createMailooChatWelcomePresetRenderer(welcomePreset.preset)\n : undefined,\n [welcomePreset]\n )\n\n const panelClassName = welcomePreset\n ? mailooChatWelcomePresetPanelClassName(welcomePreset.preset)\n : undefined\n\n return (\n <MailooSiteChatWidget\n apiOrigin={chat.apiOrigin}\n projectUid={chat.projectUid}\n integrationId={chat.integrationId}\n welcomeMessage={chat.welcomeMessage}\n locale={chat.locale}\n isAuthenticated={chat.isAuthenticated}\n widgetConfig={chat.widgetConfig}\n open={open}\n onOpenChange={setOpen}\n renderWelcome={renderWelcome}\n panelClassName={panelClassName}\n unavailableAction={unavailableAction}\n renderUnavailable={renderUnavailable}\n onError={onError}\n onFault={onFault}\n />\n )\n}\n\n/** Open the site chat widget (works from any client component on the page). */\nexport function openMailooSiteChat(): void {\n window.dispatchEvent(new Event(MAILOO_SITE_CHAT_OPEN_EVENT))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;AC4CD,SACE,KADF;AAzCN,SAAS,WAAW,QAA6C;AAC/D,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,UAAU,OAAO,MAAM,KAAK,CAAC;AAAA,EACtC;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,YACP,QACA,QACQ;AACR,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,OAAO,OAAO,KAAK,KAAK,OAAO;AAAA,EACxC;AACA,SAAO,OAAO;AAChB;AAMO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,QAAM,gBAAgB,MAAM,SAAS;AACrC,QAAM,QAAQ,gBACV,OAAO,mBACP,OAAO;AACX,QAAM,OAAO,gBACT,OAAO,kBACP,OAAO;AAEX,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MAEL;AAAA,6BAAC,SAAI,WAAU,aACb;AAAA,8BAAC,OAAE,WAAU,6CAA6C,iBAAM;AAAA,UAChE,oBAAC,OAAE,WAAU,yDACV,gBACH;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,uBACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAW,mCAAmC,aAAa;AAAA,cAE1D,iBAAO;AAAA;AAAA,UACV;AAAA,UACC,oBACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,WAAW,iBAAiB;AAAA,cACjC,GAAI,kBAAkB,SAAS,SAC5B,EAAE,QAAQ,UAAU,KAAK,sBAAsB,IAC/C,CAAC;AAAA,cACL,WAAU;AAAA,cAET,sBAAY,mBAAmB,MAAM;AAAA;AAAA,UACxC,IACE;AAAA,WACN;AAAA;AAAA;AAAA,EACF;AAEJ;;;ADuQoB,SAyFJ,UAzFI,OAAAA,MAGJ,QAAAC,aAHI;AAnPb,SAAS,qBAAqB,OAA8B;AACjE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,IAAwB;AAAA,IAC5B,GAAG,oBAAoB,MAAM;AAAA,IAC7B,GAAG;AAAA,EACL;AACA,QAAM,QAAQ,aAAa,EAAE;AAE7B,QAAM,eAAe,aAAa;AAClC,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,WAAW;AACpE,QAAM,OAAO,eAAe,WAAW;AACvC,QAAM,UAAU,CAAC,SAAkB;AACjC,mBAAe,IAAI;AACnB,QAAI,CAAC,aAAc,qBAAoB,IAAI;AAAA,EAC7C;AAEA,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAS,KAAK;AAClE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAwB,IAAI;AAE1E,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,oBAAoB,OAA8B,IAAI;AAE5D,QAAM,mBAAmB,OAAO,IAAI;AACpC,QAAM,wBAAwB;AAE9B,QAAM,aAAa,uBAAuB,gBAAgB,MAAS;AACnE,QAAM,WACJ;AACF,QAAM,cAAc,cAAc,gBAAgB;AAClD,QAAM,gBAAgB,cAAc,kBAAkB;AACtD,QAAM,SAAS,cAAc,UAAU,CAAC;AACxC,QAAM,qBAAqB,cAAc,aAAa,CAAC,GAAG;AAAA,IACxD,CAAC,OAAO,GAAG;AAAA,EACb;AAEA,QAAM,UAAU,qBAAqB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,mBAAmB,YAAY,MAAM;AACzC,UAAM,KAAK,kBAAkB;AAC7B,QAAI,CAAC,GAAI;AACT,UAAM,qBACJ,GAAG,eAAe,GAAG,YAAY,GAAG;AACtC,qBAAiB,UAAU,sBAAsB;AAAA,EACnD,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,QAAS;AAC/B,UAAM,KAAK,kBAAkB;AAC7B,QAAI,CAAC,GAAI;AACT,OAAG,YAAY,GAAG;AAAA,EACpB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,OAAO,YAAY;AACvB,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,CAAC,QAAQ,QAAS;AACtB,qBAAiB,UAAU;AAC3B,UAAM,KAAK,MAAM,YAAY,MAAM;AAAA,MACjC,qBAAqB,EAAE;AAAA,MACvB,SAAS,mBAAmB;AAAA,IAC9B,CAAC;AACD,QAAI,GAAI,UAAS,EAAE;AAAA,EACrB;AAEA,QAAM,SAAS,MAAM,QAAQ,CAAC,IAAI;AAClC,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,mBAAmB,CAAC;AAC9C,QAAM,kBAAkB,SAAS;AACjC,QAAM,YACJ,CAAC,mBACD,wBACA,SAAS,WAAW,KACpB,CAAC;AACH,QAAM,kBAAkB,aAAa,iBAAiB;AACtD,QAAM,mBAAmB,aAAa,iBAAiB;AACvD,QAAM,eACJ,CAAC,oBACA,eAAe,SAAS,SAAS,MAClC;AACF,QAAM,oBAAoB,CAAC,mBAAmB;AAE9C,QAAM,kBAA0D,QAC5D;AAAA,IACE;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP;AAAA,IACA,eAAe;AAAA,EACjB,IACA;AAEJ,QAAM,mBAAmB,CAAC,wBAA0C;AAClE,QAAI,mBAAmB,gBAAgB;AACrC,qBAAe,IAAI;AACnB,aAAO;AAAA,IACT;AACA,UAAM,KAAK,oBAAoB,mBAAmB;AAClD,QAAI,GAAI,gBAAe,IAAI;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,sBAAkB;AAAA,EACpB;AAEA,QAAM,eAAe,MAAM;AACzB,mBAAe,KAAK;AACpB,0BAAsB,KAAK;AAAA,EAC7B;AAEA,QAAM,oBAAoB,eAAe,CAAC;AAE1C,QAAM,cAA2C;AAAA,IAC/C;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP;AAAA,IACA,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,EACvB;AAEA,QAAM,YAAY;AAAA,IAChB,iCAAiC,QAAQ;AAAA,IACzC,aAAa;AAAA,EACf,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,qBAAkB;AAAA,MAClB,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAI,UAAU,OAAO,EAAE,OAAO,IAAI,CAAC;AAAA,MACrC;AAAA,MAEC;AAAA,gBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,qBAAqB,kBAAkB,EAAE;AAAA,YACpD,OAAO;AAAA,YAEN;AAAA,oCACE,eACC,aAAa;AAAA,gBACX,gBAAgB;AAAA,gBAChB,OAAO;AAAA,cACT,CAAC,IAED,gBAAAA,MAAC,SAAI,WAAU,kFACZ;AAAA,oCACC,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,WAAU;AAAA,oBACV,cAAY,EAAE;AAAA,oBACd,OAAO,EAAE;AAAA,oBAET,0BAAAA,KAAC,mBAAgB,WAAU,WAAU,eAAW,MAAC;AAAA;AAAA,gBACnD,IACE;AAAA,gBACJ,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,kCAAAD,KAAC,OAAE,WAAU,qDACV,uBACH;AAAA,kBACA,gBAAAA,KAAC,OAAE,WAAU,4CACV,yBACH;AAAA,mBACF;AAAA,iBACF;AAAA,cAGH,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,mBAC7C,gBAAAA,KAAC,OAAE,WAAU,8FACV,YAAE,gBACL;AAAA,cAGD,mBAAmB,kBAClB,gBAAAC,MAAC,SAAI,WAAU,gDACZ;AAAA,yBAAS,SAAS,IACjB,gBAAAD,KAAC,SAAI,WAAU,2GACZ,mBAAS,IAAI,CAAC,MACb,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBAEC,WACE,EAAE,gBAAgB,aACd,qDACA;AAAA,oBAGN,0BAAAA,KAAC,OAAE,WAAU,wDACV,YAAE,SACL;AAAA;AAAA,kBATK,EAAE;AAAA,gBAUT,CACD,GACH,IACE;AAAA,gBACH,oBACG,kBAAkB,eAAe,IACjC,2BAA2B,eAAe;AAAA,iBAChD,IACE;AAAA,cAEH,mBACC,gBAAAA,KAAC,SAAI,WAAU,gDACZ,wBAAc,WAAW,GAC5B;AAAA,cAGD,oBACC,gBAAAC,MAAC,SAAI,WAAU,uEACZ;AAAA,uBAAO,SAAS,KACf,gBAAAD,KAAC,SAAI,WAAU,wBACZ,iBAAO;AAAA,kBAAI,CAAC,UACX,MAAM,WAAW,kBAAkB,MAAM,cACvC,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBAEC,MAAM,MAAM;AAAA,sBACZ,QAAO;AAAA,sBACP,KAAI;AAAA,sBACJ,WAAW,iCAAiC,QAAQ;AAAA,sBAEnD,gBAAM;AAAA;AAAA,oBANF,MAAM;AAAA,kBAOb,IAEA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBAEC,MAAK;AAAA,sBACL,SAAS,MACP;AAAA,wBAAmB,CAAC,SAClB,SAAS,MAAM,KAAK,OAAO,MAAM;AAAA,sBACnC;AAAA,sBAEF,WAAW,iCACT,oBAAoB,MAAM,KACtB,WACA,sFACN;AAAA,sBAEC,gBAAM;AAAA;AAAA,oBAbF,MAAM;AAAA,kBAcb;AAAA,gBAEJ,GACF;AAAA,gBAED,oBACC,gBAAAC,MAAA,YACE;AAAA,kCAAAD,KAAC,OAAE,WAAU,oCAAoC,YAAE,OAAM;AAAA,kBACzD,gBAAAC,MAAC,SACC;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,WAAU;AAAA,wBAET,YAAE;AAAA;AAAA,oBACL;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,IAAG;AAAA,wBACH,MAAK;AAAA,wBACL,cAAa;AAAA,wBACb,OAAO;AAAA,wBACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,wBAC7C,aAAa,EAAE;AAAA,wBACf,WAAU;AAAA;AAAA,oBACZ;AAAA,qBACF;AAAA,kBACA,gBAAAC,MAAC,SACC;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,WAAU;AAAA,wBAET,YAAE;AAAA;AAAA,oBACL;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,IAAG;AAAA,wBACH,MAAK;AAAA,wBACL,cAAa;AAAA,wBACb,OAAO;AAAA,wBACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,wBAC5C,aAAa,EAAE;AAAA,wBACf,WAAU;AAAA;AAAA,oBACZ;AAAA,qBACF;AAAA,kBACC,SACC,gBAAAA,KAAC,OAAE,WAAU,0CACV,iBACH;AAAA,mBAEJ;AAAA,gBAEF,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,iBAAiB,EAAE,YAAY;AAAA,oBAC9C,WAAW,mCAAmC,QAAQ;AAAA,oBAErD,YAAE;AAAA;AAAA,gBACL;AAAA,iBACF;AAAA,cAGD,gBACC,gBAAAC,MAAC,SAAI,WAAU,gCACZ;AAAA,iBAAC,mBACA,gBAAAA,MAAA,YACE;AAAA,kCAAAA,MAAC,SAAI,WAAU,2JACb;AAAA,oCAAAD,KAAC,UAAK,WAAU,YAAY,sBAAW;AAAA,oBACvC,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,oBAAoB;AAAA,wBACnC,WAAU;AAAA,wBAET,YAAE;AAAA;AAAA,oBACL;AAAA,qBACF;AAAA,kBACC,sBACC,gBAAAA,KAAC,SAAI,WAAU,oEACb,0BAAAC,MAAC,SAAI,WAAU,0BACb;AAAA,oCAAAD,KAAC,OAAE,WAAU,4EACV,YAAE,YACL;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,sBAAsB,KAAK;AAAA,wBAC1C,WAAU;AAAA,wBACV,cAAY,EAAE;AAAA,wBACd,OAAO,EAAE;AAAA,wBAET,0BAAAA,KAAC,iBAAc,WAAU,WAAU,eAAW,MAAC;AAAA;AAAA,oBACjD;AAAA,qBACF,GACF;AAAA,mBAEJ;AAAA,gBAEF,gBAAAC,MAAC,SAAI,WAAU,0CACZ;AAAA,mBAAC,mBAAmB,CAAC,sBACpB,gBAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,sBAAsB,IAAI;AAAA,sBACzC,WAAU;AAAA,sBACV,iBAAe;AAAA,sBACf,cAAY,EAAE;AAAA,sBACd,OAAO,EAAE;AAAA,sBAET,0BAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,eAAW;AAAA;AAAA,sBACb;AAAA;AAAA,kBACF;AAAA,kBAEF,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK;AAAA,sBACL,UAAU;AAAA,sBACV,WAAW,wDACT,CAAC,mBAAmB,CAAC,qBAAqB,eAAe,EAC3D;AAAA,sBAEC;AAAA,iCAAS,WAAW,MAClB,cACC,YAAY,EAAE,gBAAgB,CAAC,IAE/B,gBAAAD,KAAC,OAAE,WAAU,oCACV,4BACG,EAAE,2BACF,EAAE,kBACR;AAAA,wBAEH,SAAS,IAAI,CAAC,MACb,gBAAAC;AAAA,0BAAC;AAAA;AAAA,4BAEC,WACE,EAAE,gBAAgB,aACd,qDACA;AAAA,4BAGN;AAAA,8CAAAD,KAAC,OAAE,WAAU,wDACV,YAAE,SACL;AAAA,8BACA,gBAAAA,KAAC,OAAE,WAAU,kCACV,cAAI,KAAK,EAAE,SAAS,EAAE,eAAe,GACxC;AAAA;AAAA;AAAA,0BAZK,EAAE;AAAA,wBAaT,CACD;AAAA;AAAA;AAAA,kBACH;AAAA,mBACF;AAAA,gBACC,SAAS,kBACR,gBAAAA,KAAC,OAAE,WAAU,+CACV,iBACH;AAAA,gBAED,cAAc,oBACb,gBAAAA,KAAC,OAAE,WAAU,0DACX,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,aAAa;AAAA,oBACnB,QAAO;AAAA,oBACP,KAAI;AAAA,oBACJ,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED,GACF;AAAA,gBAEF,gBAAAC,MAAC,SAAI,WAAU,yEACb;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,sBACxC,WAAW,CAAC,MAAM;AAChB,4BAAI,EAAE,QAAQ,QAAS,MAAK,KAAK;AAAA,sBACnC;AAAA,sBACA,aAAa,EAAE;AAAA,sBACf,WAAU;AAAA;AAAA,kBACZ;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,KAAK,KAAK;AAAA,sBACzB,UAAU;AAAA,sBACV,WAAW,uDAAuD,QAAQ;AAAA,sBAEzE,YAAE;AAAA;AAAA,kBACL;AAAA,mBACF;AAAA,iBACF;AAAA;AAAA;AAAA,QAEJ;AAAA,QAED,iBACC,eAAe,EAAE,MAAM,OAAO,CAAC,IAE/B,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAW,wBAAwB,qBAAqB,EAAE;AAAA,YAC1D,cACE,OAAO,EAAE,gBAAiB,iBAAiB,EAAE;AAAA,YAG9C;AAAA,qBACC,gBAAAD,KAAC,aAAU,WAAU,8BAA6B,eAAW,MAAC,IAE9D,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAW;AAAA;AAAA,cACb;AAAA,cAED,CAAC,QAAQ,oBACR,gBAAAA,KAAC,UAAK,WAAU,gCAA+B,eAAW,MAAC,IACzD;AAAA;AAAA;AAAA,QACN;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AEnoBA,SAAS,eAAAE,cAAa,aAAAC,YAAW,SAAS,YAAAC,iBAAgC;AAmEtE,gBAAAC,YAAA;AApDG,IAAM,8BAA8B;AAoBpC,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,gBAAgB,mCAAmC;AACzD,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAS,KAAK;AACtC,QAAM,WAAWC,aAAY,MAAM,QAAQ,IAAI,GAAG,CAAC,CAAC;AAEpD,EAAAC,WAAU,MAAM;AACd,UAAM,SAAS,MAAM,SAAS;AAC9B,WAAO,iBAAiB,6BAA6B,MAAM;AAC3D,WAAO,MAAM;AACX,aAAO,oBAAoB,6BAA6B,MAAM;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,gBAAgB;AAAA,IACpB,MACE,gBACI,sCAAsC,cAAc,MAAM,IAC1D;AAAA,IACN,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,iBAAiB,gBACnB,sCAAsC,cAAc,MAAM,IAC1D;AAEJ,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,eAAe,KAAK;AAAA,MACpB,gBAAgB,KAAK;AAAA,MACrB,QAAQ,KAAK;AAAA,MACb,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;AAGO,SAAS,qBAA2B;AACzC,SAAO,cAAc,IAAI,MAAM,2BAA2B,CAAC;AAC7D;","names":["jsx","jsxs","useCallback","useEffect","useState","jsx","useState","useCallback","useEffect"]}
|