@akropolys/kiku 1.0.0 → 1.1.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SearchBar.tsx","../src/utils/cn.ts","../src/components/ChatWidget.tsx","../src/utils/markdown.tsx","../src/components/KikuButton.tsx","../src/components/ComparisonMatrix.tsx","../src/components/Sparkle.tsx","../src/components/CartBadge.tsx","../src/components/CartDrawer.tsx","../src/components/CheckoutModal.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\nimport { useSearch, SearchResult, AkropolysTheme, useAkropolysContext } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\n\nexport interface SearchBarProps {\n placeholder?: string;\n limit?: number;\n /** Debounce in ms — default 300 for smooth type-ahead */\n debounceMs?: number;\n onSelect?: (result: SearchResult) => void;\n className?: string;\n inputClassName?: string;\n dropdownClassName?: string;\n renderResult?: (result: SearchResult) => React.ReactNode;\n theme?: AkropolysTheme;\n classNames?: {\n root?: string;\n input?: string;\n dropdown?: string;\n row?: string;\n };\n}\n\n/* SVG search glass — pure inline so no icon dependency */\nconst SearchIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\"/>\n <line x1=\"13\" y1=\"13\" x2=\"18\" y2=\"18\"/>\n </svg>\n);\n\nexport function SearchBar({\n placeholder = 'Search products…',\n limit = 10,\n debounceMs = 300,\n onSelect,\n className,\n inputClassName,\n dropdownClassName,\n renderResult,\n theme,\n classNames = {},\n}: SearchBarProps) {\n const [query, setQuery] = useState('');\n const [open, setOpen] = useState(false);\n const [isDebouncing, setIsDebouncing] = useState(false);\n const { results, loading, search, clear } = useSearch();\n const client = useAkropolysContext();\n const timer = useRef<ReturnType<typeof setTimeout>>();\n const wrap = useRef<HTMLDivElement>(null);\n const ignoreNextQueryChange = useRef(false);\n\n /* Debounce search — but keep stale results visible between calls */\n useEffect(() => {\n if (ignoreNextQueryChange.current) {\n ignoreNextQueryChange.current = false;\n return;\n }\n clearTimeout(timer.current);\n if (!query.trim()) {\n clear();\n setOpen(false);\n setIsDebouncing(false);\n return;\n }\n setOpen(true); // open immediately (stale results show while fetching)\n setIsDebouncing(true);\n timer.current = setTimeout(() => {\n setIsDebouncing(false);\n search(query, limit);\n }, debounceMs);\n return () => clearTimeout(timer.current);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n /* Click-outside to close */\n useEffect(() => {\n const h = (e: MouseEvent) => {\n if (wrap.current && !wrap.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', h);\n return () => document.removeEventListener('mousedown', h);\n }, []);\n\n const handleSelect = (r: SearchResult) => {\n if (query.trim()) {\n client.api.searchVector(query, 1).catch(() => {});\n }\n ignoreNextQueryChange.current = true;\n setOpen(false);\n setQuery(r.product.name);\n onSelect?.(r);\n };\n\n const handleCommitSearch = () => {\n if (!query.trim()) return;\n client.api.searchVector(query, 1).catch(() => {});\n if (results.length > 0) {\n handleSelect(results[0]);\n }\n };\n\n const showDrop = open && query.trim().length > 0;\n\n const customStyles = {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties;\n\n return (\n <div className={cn(\"hsk-sb-wrap\", classNames.root, className)} ref={wrap} style={customStyles}>\n <span className=\"hsk-sb-icon\"><SearchIcon /></span>\n <input\n className={cn(\"hsk-sb-input\", classNames.input, inputClassName)}\n type=\"text\"\n value={query}\n placeholder={placeholder}\n onChange={e => setQuery(e.target.value)}\n onFocus={() => results.length > 0 && query.trim() && setOpen(true)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleCommitSearch();\n }\n }}\n autoComplete=\"off\"\n spellCheck={false}\n />\n {showDrop && (\n <div className={cn(\"hsk-sb-drop\", classNames.dropdown, dropdownClassName)} style={{ position: 'absolute' }}>\n {(loading || isDebouncing) && <div className=\"hsk-sb-loading-bar\" />}\n\n {(loading || isDebouncing) && results.length === 0 ? (\n <>\n <div className=\"hsk-sb-skeleton-row\">\n <span className=\"hsk-sb-skeleton-icon\" />\n <div className=\"hsk-sb-row-body\">\n <div className=\"hsk-sb-skeleton-text1\" />\n <div className=\"hsk-sb-skeleton-text2\" />\n </div>\n </div>\n <div className=\"hsk-sb-skeleton-row\">\n <span className=\"hsk-sb-skeleton-icon\" />\n <div className=\"hsk-sb-row-body\">\n <div className=\"hsk-sb-skeleton-text1\" style={{ width: '45%' }} />\n <div className=\"hsk-sb-skeleton-text2\" style={{ width: '25%' }} />\n </div>\n </div>\n </>\n ) : (\n <>\n {results.length === 0 && !loading && !isDebouncing && (\n <div className=\"hsk-sb-empty\">No results for &ldquo;{query}&rdquo;</div>\n )}\n\n {results.map((r, i) => (\n renderResult ? (\n <div\n key={r.id}\n onClick={() => handleSelect(r)}\n className=\"hsk-sb-fade\"\n style={{ animationDelay: `${i * 18}ms` }}\n >\n {renderResult(r)}\n </div>\n ) : (\n <div\n key={r.id}\n className={cn(\"hsk-sb-row hsk-sb-fade\", classNames.row)}\n style={{ animationDelay: `${i * 18}ms` }}\n onClick={() => handleSelect(r)}\n >\n <span className=\"hsk-sb-row-icon\"><SearchIcon /></span>\n <div className=\"hsk-sb-row-body\">\n <div className=\"hsk-sb-row-title\">{r.product.name}</div>\n {(r.product.category || r.product.brand) && (\n <div className=\"hsk-sb-row-sub\">\n {r.product.category ?? r.product.brand}\n </div>\n )}\n </div>\n </div>\n )\n ))}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merges Tailwind classes intelligently, allowing overrides.\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useKiku, ChatMessage, ChatSource } from '@akropolys/sdk';\nimport { renderMarkdown } from '../utils/markdown';\nimport { AkropolysTheme } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\n\n\n\n// Better Prop Interface for SDKs\nexport interface ChatWidgetProps {\n title?: string;\n placeholder?: string;\n emptyStateText?: string;\n emptyStateSuggestions?: string;\n defaultCurrency?: string;\n className?: string;\n \n // Allow overriding styles via standard CSS variables\n theme?: AkropolysTheme;\n \n // Allow targeting specific elements with custom classes (e.g. Tailwind)\n classNames?: {\n root?: string;\n header?: string;\n messageBubble?: string;\n input?: string;\n };\n \n onSelectSource?: (source: ChatSource) => void;\n}\n\n// Simple SVG Icons instead of text characters\nconst SparkleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\"/>\n </svg>\n);\n\nconst ArrowUpIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\"/>\n <path d=\"M12 19V5\"/>\n </svg>\n);\n\nfunction SourceCard({ source, defaultCurrency, onSelect }: { source: ChatSource; defaultCurrency: string; onSelect?: (s: ChatSource) => void }) {\n return (\n <div className=\"hsk-source-card\" onClick={() => onSelect?.(source)}>\n {source.image && <img src={source.image} alt={source.name} className=\"hsk-source-img\" />}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div className=\"hsk-source-name\">{source.name}</div>\n {source.price && (\n <div className=\"hsk-source-price\">{source.currency ?? defaultCurrency} {source.price}</div>\n )}\n </div>\n </div>\n );\n}\n\nexport function ChatWidget({ \n title = 'AI Shopping Assistant',\n placeholder = 'Ask about anything in our store…', \n emptyStateText = 'Ask me anything about our products',\n emptyStateSuggestions = '\"Find me headphones under KSh 5,000\" · \"Gift ideas\"',\n defaultCurrency = 'KES',\n className,\n theme,\n classNames = {},\n onSelectSource \n}: ChatWidgetProps) {\n const { messages, sources, loading, error, send, reset } = useKiku();\n const [input, setInput] = useState('');\n const bottomRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, loading]);\n\n const handleSend = async () => {\n const q = input.trim();\n if (!q || loading) return;\n setInput('');\n if (textareaRef.current) textareaRef.current.style.height = 'auto';\n await send(q);\n };\n\n const handleKey = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const handleInput = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n const t = e.target;\n t.style.height = 'auto';\n t.style.height = Math.min(t.scrollHeight, 120) + 'px';\n };\n\n // Apply custom CSS variables inline to the root wrapper\n const customStyles = {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties;\n\n return (\n <div \n className={cn(\"hsk-chat-widget\", classNames.root, className)} \n style={customStyles}\n >\n <div className={cn(\"hsk-chat-header\", classNames.header)}>\n <span className=\"hsk-chat-header-icon\"><SparkleIcon /></span>\n <span className=\"hsk-chat-title\">{title}</span>\n <span className=\"hsk-chat-badge\">AI</span>\n {messages.length > 0 && (\n <button className=\"hsk-chat-reset\" onClick={reset} style={{ marginLeft: 'auto' }}>Clear</button>\n )}\n </div>\n\n <div className=\"hsk-chat-messages\">\n {messages.length === 0 ? (\n <div className=\"hsk-chat-empty\">\n <div className=\"hsk-chat-empty-icon\"><SparkleIcon /></div>\n <div>{emptyStateText}</div>\n <div className=\"hsk-chat-empty-suggestions\">{emptyStateSuggestions}</div>\n </div>\n ) : (\n messages.map((msg, idx) => (\n <div key={idx}>\n <div className={`hsk-msg-row ${msg.role}`}>\n <div className={cn(\"hsk-msg-avatar\", msg.role === 'assistant' ? 'ai' : 'user')}>\n {msg.role === 'assistant' ? <SparkleIcon /> : 'U'}\n </div>\n <div className={cn(\"hsk-msg-bubble\", msg.role, classNames.messageBubble)}>\n {renderMarkdown(msg.content)}\n </div>\n </div>\n {msg.role === 'assistant' && idx === messages.length - 1 && sources.length > 0 && (\n <div className=\"hsk-sources-container\">\n <div className=\"hsk-sources\">\n {sources.map((src, si) => (\n <SourceCard key={si} source={src} defaultCurrency={defaultCurrency} onSelect={onSelectSource} />\n ))}\n </div>\n </div>\n )}\n </div>\n ))\n )}\n\n {loading && (\n <div className=\"hsk-msg-row\">\n <div className=\"hsk-msg-avatar ai\"><SparkleIcon /></div>\n <div className=\"hsk-pending\" role=\"status\" aria-live=\"polite\">\n <div className=\"hsk-pending-glyph\">\n <span className=\"hsk-pending-ring\" />\n <span className=\"hsk-pending-dot\" />\n </div>\n <div className=\"hsk-pending-text\">\n <span className=\"hsk-pending-step step-1\">Searching catalog</span>\n <span className=\"hsk-pending-step step-2\">Reasoning</span>\n <span className=\"hsk-pending-step step-3\">Composing</span>\n </div>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"hsk-chat-error\">\n {(() => {\n try {\n const parsed = JSON.parse(error);\n return parsed.error || parsed.message || error;\n } catch {\n return error;\n }\n })()}\n </div>\n )}\n <div ref={bottomRef} />\n </div>\n\n <div className=\"hsk-chat-input-area\">\n <textarea\n ref={textareaRef}\n className={cn(\"hsk-chat-input\", classNames.input)}\n value={input}\n onChange={handleInput}\n onKeyDown={handleKey}\n placeholder={placeholder}\n rows={1}\n disabled={loading}\n />\n <button\n className=\"hsk-chat-send\"\n onClick={handleSend}\n disabled={!input.trim() || loading}\n aria-label=\"Send message\"\n >\n <ArrowUpIcon />\n </button>\n </div>\n </div>\n );\n}\n\n","import React from 'react';\n\n// Helper to parse inline styles (bold, links, and inline code) safely into React nodes\nconst parseInline = (text: string, keyPrefix: string): React.ReactNode => {\n // Regex to match markdown links, bold text, and inline code\n const tokenRegex = /(\\[[^\\]]+\\]\\([^)]+\\)|\\*\\*[^*]+\\*\\*|`[^`]+`)/g;\n const parts = text.split(tokenRegex);\n\n return parts.map((part, index) => {\n if (!part) return null;\n const key = `${keyPrefix}-inline-${index}`;\n\n // Handle Inline Code\n if (part.startsWith('`') && part.endsWith('`')) {\n return (\n <code key={key} className=\"hsk-markdown-code\">\n {part.slice(1, -1)}\n </code>\n );\n }\n\n // Handle Bold\n if (part.startsWith('**') && part.endsWith('**')) {\n return <strong key={key}>{parseInline(part.slice(2, -2), key)}</strong>;\n }\n\n // Handle Links\n const linkMatch = part.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)$/);\n if (linkMatch) {\n // Basic sanitization: ensure the URL doesn't contain javascript:\n const url = linkMatch[2];\n const isSafeUrl = /^(https?|mailto|tel):/i.test(url) || url.startsWith('/');\n if (isSafeUrl) {\n return (\n <a key={key} href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hsk-markdown-link\">\n {parseInline(linkMatch[1], key)}\n </a>\n );\n }\n return <span key={key}>{parseInline(linkMatch[1], key)}</span>; // Fallback to plain text if unsafe\n }\n\n // Return standard text\n return part;\n });\n};\n\nexport function renderMarkdown(content: string): React.ReactNode {\n const lines = content.split('\\n');\n const elements: React.ReactNode[] = [];\n \n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n const key = `md-line-${i}`;\n\n // 1. Empty lines (spacing)\n if (!line.trim()) {\n i++;\n continue;\n }\n\n // 2. Headers\n const headerMatch = line.match(/^(#{1,3})\\s+(.*)/);\n if (headerMatch) {\n const level = headerMatch[1].length;\n const Tag = `h${level + 3}` as keyof JSX.IntrinsicElements; // Maps # to h4, ## to h5 to avoid messing up host page hierarchy\n elements.push(<Tag key={key} className={`hsk-markdown-h${level}`}>{parseInline(headerMatch[2], key)}</Tag>);\n i++;\n continue;\n }\n\n // 3. Unordered Lists\n if (line.match(/^[-*]\\s+/)) {\n const listItems: React.ReactNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s+/)) {\n const itemText = lines[i].replace(/^[-*]\\s+/, '');\n listItems.push(<li key={`li-${i}`}>{parseInline(itemText, `li-${i}`)}</li>);\n i++;\n }\n elements.push(<ul key={`ul-${key}`} className=\"hsk-markdown-list\">{listItems}</ul>);\n continue;\n }\n\n // 4. Tables\n if (line.trim().startsWith('|')) {\n const tableRows: React.ReactNode[] = [];\n let isHeader = true;\n\n while (i < lines.length && lines[i].trim().startsWith('|')) {\n const rowLine = lines[i].trim();\n // Skip markdown table separator (e.g., |---|---|)\n if (rowLine.match(/^\\|[-:| ]+\\|$/)) {\n i++;\n isHeader = false;\n continue;\n }\n\n // Slice to remove outer pipes and map trim to handle empty cells properly\n const cells = rowLine.split('|').slice(1, -1).map(c => c.trim());\n const Tag = isHeader ? 'th' : 'td';\n \n tableRows.push(\n <tr key={`tr-${i}`}>\n {cells.map((cell, cIdx) => (\n <Tag key={`td-${i}-${cIdx}`}>{parseInline(cell, `td-${i}-${cIdx}`)}</Tag>\n ))}\n </tr>\n );\n i++;\n }\n \n elements.push(\n <div key={`table-wrapper-${key}`} className=\"hsk-table-wrapper\">\n <table className=\"hsk-markdown-table\">\n <tbody>{tableRows}</tbody>\n </table>\n </div>\n );\n continue;\n }\n\n // 5. Default Paragraph\n elements.push(\n <p key={key} className=\"hsk-markdown-p\">\n {parseInline(line, key)}\n </p>\n );\n i++;\n }\n\n return <>{elements}</>;\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useKiku, ChatMessage, ChatSource } from '@akropolys/sdk';\nimport { usePaymentPolling } from '@akropolys/sdk';\nimport { useAkropolysContext } from '@akropolys/sdk';\nimport { renderMarkdown } from '../utils/markdown';\nimport { AkropolysTheme, CartPayload, CartItem } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\nimport { ComparisonMatrix } from './ComparisonMatrix';\n\n\nexport interface KikuButtonProps {\n label?: string;\n title?: string;\n placeholder?: string;\n backdropColor?: string;\n backdropBlur?: string | number;\n className?: string;\n onSelectSource?: (source: ChatSource) => void;\n defaultCurrency?: string;\n chips?: string[];\n theme?: 'light' | 'dark' | AkropolysTheme;\n classNames?: {\n button?: string;\n overlay?: string;\n panel?: string;\n input?: string;\n sendButton?: string;\n };\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\n/**\n * Akropolys brand mark — an ancient serif capital Alpha (Α)\n * with an animated smooth breathing mark (spiritus lenis ʻ) at top-left.\n * The mark pulses gently, like a breath.\n */\nconst AkropolysAIcon = ({ className, size = 18 }: { className?: string; size?: number }) => (\n <svg\n className={cn(\"hsk-brand-a\", className)}\n width={size}\n height={size}\n viewBox=\"0 0 28 30\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-label=\"Akropolys\"\n >\n {/* Left leg: elegant thin stroke */}\n <path\n d=\"M14.5 4.5 L6.5 25\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n />\n {/* Right leg: bold ancient serif thick stroke */}\n <path\n d=\"M14.5 4.5 L22.5 25\"\n stroke=\"currentColor\"\n strokeWidth=\"4.2\"\n strokeLinecap=\"round\"\n />\n {/* Crossbar */}\n <path\n d=\"M9.5 17 H19.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n {/* Left base serif */}\n <path\n d=\"M3 25 H10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n {/* Right base serif */}\n <path\n d=\"M19 25 H26\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n {/* Smooth breathing mark (spiritus lenis) at top-left — animated */}\n <path\n d=\"M8.5 2.5 C10 2.5, 11 3.5, 11 5 C11 7, 8.5 8.5, 7.5 9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n className=\"hsk-akr-breath\"\n />\n </svg>\n);\n\n/** Keep a tiny sparkle alias for places that still want the star (sources, etc.) */\nconst SparkleIcon = AkropolysAIcon;\n\nconst ArrowUpIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\"/>\n <path d=\"M12 19V5\"/>\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n);\n\nconst ChevronRightIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\"/>\n </svg>\n);\n\nconst HistoryIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/>\n <path d=\"M3 3v5h5\"/>\n <path d=\"M12 7v5l4 2\"/>\n </svg>\n);\n\nconst NewChatIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M5 12h14\"/>\n </svg>\n);\n\nconst ShoppingBagIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"/>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/>\n <path d=\"M16 10a4 4 0 0 1-8 0\"/>\n </svg>\n);\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst DEFAULT_CHIPS = [\n 'Cheapest smartphone',\n 'Smart TV under KSh 20,000',\n 'Noise-cancelling headphones',\n 'Best laptop for students',\n];\n\nconst SESSIONS_KEY = 'akropolys_chat_sessions';\nconst MAX_SESSIONS = 20;\n\n// ─── Session types ─────────────────────────────────────────────────────────────\n\ninterface ChatSession {\n id: string;\n title: string;\n messages: ChatMessage[];\n ts: number;\n}\n\nfunction loadSessions(): ChatSession[] {\n try {\n if (typeof window === 'undefined') return [];\n const raw = localStorage.getItem(SESSIONS_KEY);\n return raw ? JSON.parse(raw) : [];\n } catch {\n return [];\n }\n}\n\nfunction saveSessions(sessions: ChatSession[]) {\n try {\n if (typeof window === 'undefined') return;\n localStorage.setItem(SESSIONS_KEY, JSON.stringify(sessions.slice(0, MAX_SESSIONS)));\n } catch {}\n}\n\nfunction relativeTime(ts: number): string {\n const diff = Date.now() - ts;\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n return `${days}d ago`;\n}\n\n// ─── Cart Context Card ─────────────────────────────────────────────────────────\n\ninterface CartContextCardProps {\n cart: CartPayload;\n defaultCurrency: string;\n}\n\nfunction CartContextCard({ cart, defaultCurrency }: CartContextCardProps) {\n if (!cart.items || cart.items.length === 0) return null;\n\n const currency = cart.currency || defaultCurrency;\n const total = cart.total ?? cart.items.reduce((s: number, i: CartItem) => s + i.price_numeric * i.quantity, 0);\n\n return (\n <div className=\"hsk-cart-card\">\n <div className=\"hsk-cart-card-header\">\n <ShoppingBagIcon />\n <span>Your cart · {cart.item_count ?? cart.items.length} item{(cart.item_count ?? cart.items.length) !== 1 ? 's' : ''}</span>\n </div>\n <div className=\"hsk-cart-items\">\n {cart.items.map((item: CartItem) => (\n\n <div key={item.id} className=\"hsk-cart-item\">\n <div className=\"hsk-cart-item-img-wrap\">\n {item.image ? (\n <img className=\"hsk-cart-item-img\" src={item.image} alt={item.name} loading=\"lazy\" />\n ) : (\n <div className=\"hsk-cart-item-img-placeholder\">\n <ShoppingBagIcon />\n </div>\n )}\n {item.quantity > 1 && (\n <span className=\"hsk-cart-item-qty\">{item.quantity}</span>\n )}\n </div>\n <div className=\"hsk-cart-item-info\">\n <div className=\"hsk-cart-item-name\">{item.name}</div>\n <div className=\"hsk-cart-item-price\">\n {item.quantity > 1 && <span className=\"hsk-cart-item-qty-label\">{item.quantity}× </span>}\n {currency} {(item.price_numeric * item.quantity).toLocaleString()}\n </div>\n </div>\n </div>\n ))}\n </div>\n <div className=\"hsk-cart-total\">\n <span>Total</span>\n <span className=\"hsk-cart-total-amount\">{currency} {total.toLocaleString()}</span>\n </div>\n </div>\n );\n}\n\n// ─── Action Pills ──────────────────────────────────────────────────────────────\n\ninterface ActionPillsProps {\n cart: CartPayload;\n actionType?: string;\n onSend: (text: string) => void;\n loading: boolean;\n}\n\nfunction ActionPills({ cart, actionType, onSend, loading }: ActionPillsProps) {\n const hasItems = cart.items && cart.items.length > 0;\n const lastItem = hasItems ? cart.items[cart.items.length - 1] : null;\n\n const pills: { label: string; query: string; emoji: string }[] = [];\n\n if (hasItems && lastItem) {\n if (actionType === 'add_to_cart') {\n pills.push({ emoji: '➕', label: 'Add 1 more', query: `Add one more ${lastItem.name} to my cart` });\n pills.push({ emoji: '🗑️', label: `Remove ${lastItem.name.split(' ')[0]}`, query: `Remove the ${lastItem.name} from my cart` });\n }\n if (cart.items.length > 1) {\n pills.push({ emoji: '🛒', label: 'View cart', query: 'Show me my cart' });\n }\n pills.push({ emoji: '💳', label: 'Checkout', query: 'Proceed to checkout' });\n pills.push({ emoji: '🛍️', label: 'Keep shopping', query: 'What else do you recommend?' });\n } else if (actionType === 'clear_cart' || actionType === 'remove_from_cart') {\n pills.push({ emoji: '🛍️', label: 'Continue shopping', query: 'Show me popular products' });\n pills.push({ emoji: '🔍', label: 'Search again', query: 'Help me find something' });\n } else if (actionType === 'view_cart') {\n if (hasItems) {\n pills.push({ emoji: '💳', label: 'Checkout', query: 'Proceed to checkout' });\n pills.push({ emoji: '🗑️', label: 'Clear cart', query: 'Clear my cart' });\n }\n }\n\n if (pills.length === 0) return null;\n\n return (\n <div className=\"hsk-action-pills\">\n {pills.map((pill) => (\n <button\n key={pill.query}\n className=\"hsk-action-pill\"\n onClick={() => onSend(pill.query)}\n disabled={loading}\n >\n <span className=\"hsk-pill-emoji\">{pill.emoji}</span>\n {pill.label}\n </button>\n ))}\n </div>\n );\n}\n\n// ─── Sources Carousel ──────────────────────────────────────────────────────────\n\ninterface SourcesCarouselProps {\n sources: ChatSource[];\n defaultCurrency: string;\n onSelectSource?: (src: ChatSource) => void;\n}\n\nfunction SourcesCarousel({ sources, defaultCurrency, onSelectSource }: SourcesCarouselProps) {\n const client = useAkropolysContext();\n const isProperty = client?.vertical === 'property';\n const railRef = useRef<HTMLDivElement>(null);\n const [showNext, setShowNext] = useState(false);\n\n const measure = useCallback(() => {\n const el = railRef.current;\n if (!el) return;\n const atEnd = el.scrollLeft + el.clientWidth >= el.scrollWidth - 8;\n setShowNext(el.scrollWidth > el.clientWidth + 4 && !atEnd);\n }, []);\n\n useEffect(() => {\n measure();\n const el = railRef.current;\n if (!el) return;\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n el.addEventListener('scroll', measure, { passive: true });\n return () => { ro.disconnect(); el.removeEventListener('scroll', measure); };\n }, [measure, sources]);\n\n const scrollNext = () => {\n railRef.current?.scrollBy({ left: 170, behavior: 'smooth' });\n };\n\n return (\n <div className=\"hsk-cb-sources-wrap\">\n <div className=\"hsk-cb-sources\" ref={railRef}>\n {sources.map((src, si) => (\n <div\n key={si}\n className=\"hsk-cb-source\"\n style={{ animationDelay: `${si * 50}ms` }}\n onClick={() => onSelectSource?.(src)}\n >\n {src.image ? (\n <div className=\"hsk-cb-src-imgwrap\" style={{ position: 'relative' }}>\n <img src={src.image} alt={src.name} loading=\"lazy\" />\n {isProperty && (\n <div style={{\n position: 'absolute',\n top: '6px',\n right: '6px',\n background: 'rgba(14, 14, 15, 0.75)',\n backdropFilter: 'blur(4px)',\n borderRadius: '50%',\n width: '24px',\n height: '24px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fbbf24', // Gold sparkle badge\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)'\n }}>\n <SparkleIcon size={12} />\n </div>\n )}\n </div>\n ) : (\n <div className=\"hsk-cb-src-imgwrap-empty\">\n <SparkleIcon />\n </div>\n )}\n <div className=\"hsk-cb-src-info\">\n <div className=\"hsk-cb-src-name\">{src.name}</div>\n {src.price && (\n <div className=\"hsk-cb-src-price\">\n {src.currency ?? defaultCurrency}{' '}\n {parseFloat(String(src.price).replace(/[^0-9.]/g, '') || '0').toLocaleString()}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n {showNext && (\n <>\n <div\n className=\"hsk-cb-sources-fade\"\n style={{ background: 'linear-gradient(to right, transparent, var(--hsk-fade-bg, #0e0e0f))' }}\n />\n <button className=\"hsk-cb-sources-next\" onClick={scrollNext} aria-label=\"See more\">\n <ChevronRightIcon />\n </button>\n </>\n )}\n </div>\n );\n}\n\n// ─── Strip markdown tables (used for compare view to avoid duplicate) ──────────\n\nfunction stripMarkdownTables(content: string): string {\n const lines = content.split('\\n');\n const out: string[] = [];\n for (const line of lines) {\n if (line.trim().startsWith('|')) continue; // table row or separator\n out.push(line);\n }\n // Collapse runs of 3+ blank lines down to 2\n return out.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim();\n}\n\n// ─── Smart context pills ──────────────────────────────────────────────────────\n// Shown after every assistant response (when there's no cart action).\n// Pills are generated from the current intent + sources so they're always relevant.\n\nfunction SmartContextPills({\n intent,\n sources,\n onSend,\n loading,\n}: {\n intent: string | null;\n sources: ChatSource[];\n onSend: (text: string) => void;\n loading: boolean;\n}) {\n const client = useAkropolysContext();\n const isProperty = client?.vertical === 'property';\n if (!intent) return null;\n\n const pills: { label: string; query: string; emoji: string }[] = [];\n\n // Find the cheapest product in the sources list\n const cheapest =\n sources.length > 0\n ? sources.reduce((min, s) => {\n const p = parseFloat(String(s.price ?? '').replace(/[^0-9.]/g, ''));\n const m = parseFloat(String(min.price ?? '').replace(/[^0-9.]/g, ''));\n return !isNaN(p) && (isNaN(m) || p < m) ? s : min;\n }, sources[0])\n : null;\n\n const firstName = sources[0]?.name ?? '';\n const firstTwo = sources.slice(0, 2).map(s => s.name);\n\n if (intent === 'search' && sources.length > 0) {\n if (firstTwo.length >= 2) {\n pills.push({\n emoji: '⚖️',\n label: 'Compare top 2',\n query: `Compare the ${firstTwo[0]} and ${firstTwo[1]}`,\n });\n }\n if (cheapest && !isProperty) {\n const short = cheapest.name.split(' ').slice(0, 3).join(' ');\n pills.push({\n emoji: '🛒',\n label: `Add ${short}`,\n query: `Add the ${cheapest.name} to my cart`,\n });\n }\n if (isProperty) {\n pills.push({ emoji: '💰', label: 'Under KSh 5M', query: 'Show me options under KSh 5,000,000' });\n } else {\n pills.push({ emoji: '💰', label: 'Under KSh 20K', query: 'Show me options under KSh 20,000' });\n }\n } else if (intent === 'compare' && sources.length > 0) {\n if (cheapest && !isProperty) {\n const short = cheapest.name.split(' ').slice(0, 3).join(' ');\n pills.push({\n emoji: '🛒',\n label: `Add ${short}`,\n query: `Add the ${cheapest.name} to my cart`,\n });\n }\n if (firstName) {\n pills.push({\n emoji: '🔍',\n label: 'Similar options',\n query: isProperty\n ? `Show me more properties similar to the ${firstName}`\n : `Show me more products similar to the ${firstName}`,\n });\n }\n pills.push({ emoji: '💡', label: 'Which is best?', query: 'Which one would you recommend and why?' });\n } else if (intent === 'specs' && sources.length > 0) {\n if (firstName) {\n if (!isProperty) {\n pills.push({ emoji: '🛒', label: 'Add to cart', query: `Add the ${firstName} to my cart` });\n }\n pills.push({\n emoji: '🔄',\n label: 'Find alternatives',\n query: `What are good alternatives to the ${firstName}?`,\n });\n }\n } else if (intent === 'general') {\n if (isProperty) {\n pills.push({ emoji: '🔍', label: 'Show popular listings', query: 'What are your most popular properties?' });\n } else {\n pills.push({ emoji: '🔍', label: 'Show popular items', query: 'What are your most popular products?' });\n }\n pills.push({ emoji: '💡', label: 'Recommend something', query: 'What do you recommend for me?' });\n }\n\n if (pills.length === 0) return null;\n\n return (\n <div className=\"hsk-action-pills\">\n {pills.map(pill => (\n <button\n key={pill.query}\n className=\"hsk-action-pill\"\n onClick={() => onSend(pill.query)}\n disabled={loading}\n >\n <span className=\"hsk-pill-emoji\">{pill.emoji}</span>\n {pill.label}\n </button>\n ))}\n </div>\n );\n}\n\n// ─── Error helper ──────────────────────────────────────────────────────────────\n\nconst getFriendlyError = (err: any) => {\n let str = '';\n if (typeof err === 'string') str = err;\n else if (err && typeof err === 'object' && err.message) str = err.message;\n else try { str = JSON.stringify(err); } catch { str = String(err); }\n\n const lower = str.toLowerCase();\n if (\n lower.includes('429') ||\n lower.includes('too many requests') ||\n lower.includes('requests per minute limit exceeded') ||\n lower.includes('too_many_requests_error') ||\n lower.includes('request_quota_exceeded') ||\n lower.includes('quota')\n ) {\n return 'The assistant is currently receiving too many requests. Please try again in a few moments.';\n }\n\n if (lower.includes('token limit')) {\n return \"You've reached your usage limit. Please update your billing limits in your dashboard to continue.\";\n }\n\n try {\n const parsed = JSON.parse(str);\n return parsed.error || parsed.message || str;\n } catch {\n return str;\n }\n};\n\n// ─── ChatModal Props ───────────────────────────────────────────────────────────\n\ninterface ChatModalProps extends Pick<KikuButtonProps, 'title' | 'placeholder' | 'backdropColor' | 'backdropBlur' | 'onSelectSource' | 'defaultCurrency' | 'chips' | 'theme' | 'classNames'> {\n theme?: 'light' | 'dark' | AkropolysTheme;\n classNames?: any;\n onClose: () => void;\n}\n\n// ─── ChatModal ─────────────────────────────────────────────────────────────────\n\nconst LOADING_MESSAGES = [\n \"Walking down the aisle...\",\n \"Consulting the blueprints...\",\n \"Polishing the keys...\",\n \"Checking the backyard...\",\n \"Checking the inventory...\",\n \"Inspecting the plumbing...\",\n \"Asking the concierge...\",\n \"Searching the shelves...\",\n \"Measuring the square footage...\",\n \"Dusting off the fireplace...\",\n \"Asking the store clerk...\"\n];\n\nconst PROPERTY_CHIPS = [\n '3 bedroom apartments',\n 'Houses under KSh 5,000,000',\n 'Properties in Palm Beach',\n 'Studio apartments with pool',\n];\n\nfunction ChatModal({\n title = 'Shopping Assistant',\n placeholder = 'Ask me anything — gifts, budget, use case…',\n backdropColor,\n backdropBlur,\n onClose,\n onSelectSource,\n defaultCurrency = 'KES',\n chips = DEFAULT_CHIPS,\n theme,\n classNames = {},\n}: ChatModalProps) {\n const client = useAkropolysContext();\n const { messages, sources, loading, streaming, error, lastAction, lastIntent, send, reset } = useKiku();\n const [input, setInput] = useState('');\n const [loadingMessageIndex, setLoadingMessageIndex] = useState(0);\n\n const isProperty = client.vertical === 'property';\n const activeChips = chips === DEFAULT_CHIPS && isProperty ? PROPERTY_CHIPS : chips;\n const activeTitle = title === 'Shopping Assistant' && isProperty ? 'Property Assistant' : title;\n const activePlaceholder = placeholder === 'Ask me anything — gifts, budget, use case…' && isProperty\n ? 'Ask me anything — location, budget, bedrooms…'\n : placeholder;\n\n useEffect(() => {\n if (loading && !streaming) {\n const interval = setInterval(() => {\n setLoadingMessageIndex((prev) => (prev + 1) % LOADING_MESSAGES.length);\n }, 1500);\n return () => clearInterval(interval);\n } else {\n setLoadingMessageIndex(0);\n }\n }, [loading, streaming]);\n const [selectedProduct, setSelectedProduct] = useState<ChatSource | null>(null);\n const bottomRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [phoneInput, setPhoneInput] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_phone') || '';\n }\n return '';\n });\n const [merchantRef, setMerchantRef] = useState<string | null>(null);\n const [paymentPhase, setPaymentPhase] = useState<'idle' | 'prompt_phone' | 'awaiting' | 'done' | 'failed'>('idle');\n\n // ── History sidebar ──────────────────────────────────────────────────────────\n const [sessions, setSessions] = useState<ChatSession[]>(() => loadSessions());\n const [sidebarOpen, setSidebarOpen] = useState(false);\n const [replayMessages, setReplayMessages] = useState<ChatMessage[] | null>(null); // null = live session\n\n // ── Payment polling ──────────────────────────────────────────────────────────\n const { status: pollStatus } = usePaymentPolling({\n client: client.api,\n merchantReference: merchantRef,\n onSuccess: () => {\n setPaymentPhase('done');\n setMerchantRef(null);\n },\n onFailure: () => {\n setPaymentPhase('failed');\n setMerchantRef(null);\n },\n });\n\n // React to lastAction from chat\n useEffect(() => {\n if (!lastAction) return;\n if (lastAction.type === 'request_phone') {\n setPaymentPhase('prompt_phone');\n } else if (lastAction.type === 'awaiting_payment') {\n setMerchantRef(lastAction.merchantReference ?? null);\n setPaymentPhase('awaiting');\n }\n }, [lastAction]);\n\n const isStringTheme = typeof theme === 'string';\n const hskThemeAttr = isStringTheme ? theme : undefined;\n\n const customStyles = (!isStringTheme && theme) ? {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties : undefined;\n\n const handlePhoneSubmit = async () => {\n if (!phoneInput.trim()) return;\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem('akropolys_user_phone', phoneInput.trim());\n }\n const res = await client.api.initiatePayment(phoneInput.trim());\n setMerchantRef(res.merchantReference);\n setPaymentPhase('awaiting');\n } catch (e: any) {\n console.error('[Akropolys] initiatePayment error', e);\n setPaymentPhase('failed');\n }\n };\n\n // Auto-scroll: only when the user is already pinned near the bottom (within 120px).\n // This lets them freely scroll up to re-read earlier messages while streaming continues.\n const msgsContainerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const container = msgsContainerRef.current;\n if (!container) return;\n const distanceFromBottom = container.scrollHeight - container.scrollTop - container.clientHeight;\n if (distanceFromBottom < 120) {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n }\n }, [messages, loading, selectedProduct]);\n\n useEffect(() => {\n const h = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', h);\n return () => document.removeEventListener('keydown', h);\n }, []);\n\n // ── Save session on reset or close ───────────────────────────────────────────\n const saveCurrentSession = useCallback(() => {\n if (messages.length < 2) return; // Nothing worth saving\n const firstUser = messages.find(m => m.role === 'user');\n const session: ChatSession = {\n id: `session_${Date.now()}`,\n title: firstUser ? firstUser.content.slice(0, 60) : 'Chat session',\n messages: messages,\n ts: Date.now(),\n };\n const updated = [session, ...sessions].slice(0, MAX_SESSIONS);\n setSessions(updated);\n saveSessions(updated);\n }, [messages, sessions]);\n\n const handleReset = useCallback(() => {\n saveCurrentSession();\n reset();\n setReplayMessages(null);\n setPaymentPhase('idle');\n setMerchantRef(null);\n }, [reset, saveCurrentSession]);\n\n const handleSourceClick = (src: ChatSource) => {\n setSelectedProduct(src);\n onSelectSource?.(src);\n const q = `Tell me more about the ${src.name}${src.price ? ` (${src.currency ?? defaultCurrency} ${src.price})` : ''} — what are its key specs, who is it best for, and is it worth buying?`;\n send(q);\n };\n\n const handleSend = async (text?: string) => {\n const q = (text ?? input).trim();\n if (!q || loading) return;\n // If we're in replay mode, exit replay and continue live\n setReplayMessages(null);\n setSelectedProduct(null);\n setInput('');\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n await send(q);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); }\n };\n\n const handleInput = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n const t = e.target;\n t.style.height = 'auto';\n t.style.height = `${Math.min(t.scrollHeight, 140)}px`;\n };\n\n const blurVal = typeof backdropBlur === 'number' ? `${backdropBlur}px` : (backdropBlur ?? '20px');\n\n // The messages to display: replay or live\n const displayMessages = replayMessages ?? messages;\n\n // ── Load a historical session ─────────────────────────────────────────────────\n const loadSession = (session: ChatSession) => {\n setReplayMessages(session.messages);\n setSidebarOpen(false);\n };\n\n // ── Delete a session ──────────────────────────────────────────────────────────\n const deleteSession = (id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const updated = sessions.filter(s => s.id !== id);\n setSessions(updated);\n saveSessions(updated);\n };\n\n return (\n <div\n className={cn(\"hsk-cb-overlay\", classNames.overlay)}\n onClick={onClose}\n data-hsk-theme={hskThemeAttr}\n style={{\n backdropFilter: `blur(${blurVal})`,\n WebkitBackdropFilter: `blur(${blurVal})`,\n ...(backdropColor ? { background: backdropColor } : {}),\n ...customStyles,\n }}\n >\n <div className={cn(\"hsk-cb-panel hsk-cb-panel--with-sidebar\", classNames.panel)} onClick={e => e.stopPropagation()}>\n\n {/* ── History Sidebar ── */}\n <div className={cn(\"hsk-cb-sidebar\", sidebarOpen && \"hsk-cb-sidebar--open\")}>\n <div className=\"hsk-cb-sidebar-header\">\n <span className=\"hsk-cb-sidebar-title\">History</span>\n <button\n className=\"hsk-cb-sidebar-new\"\n onClick={handleReset}\n title=\"New chat\"\n >\n <NewChatIcon />\n <span>New chat</span>\n </button>\n </div>\n <div className=\"hsk-cb-sidebar-list\">\n {sessions.length === 0 ? (\n <div className=\"hsk-cb-sidebar-empty\">\n <HistoryIcon />\n <span>No history yet</span>\n </div>\n ) : (\n sessions.map(session => (\n <div\n key={session.id}\n className={cn(\n \"hsk-cb-sidebar-session\",\n replayMessages === session.messages && \"hsk-cb-sidebar-session--active\"\n )}\n onClick={() => loadSession(session)}\n >\n <div className=\"hsk-cb-sidebar-session-title\">{session.title}</div>\n <div className=\"hsk-cb-sidebar-session-meta\">{relativeTime(session.ts)}</div>\n <button\n className=\"hsk-cb-sidebar-session-del\"\n onClick={(e) => deleteSession(session.id, e)}\n title=\"Delete\"\n >\n ×\n </button>\n </div>\n ))\n )}\n </div>\n </div>\n\n {/* ── Main Chat Area ── */}\n <div className=\"hsk-cb-main\">\n\n {/* Top bar */}\n <div className=\"hsk-cb-topbar\">\n <div className=\"hsk-cb-topbar-left\">\n {/* Sidebar toggle (always visible) */}\n <button\n className={cn(\"hsk-cb-sidebar-toggle\", sidebarOpen && \"hsk-cb-sidebar-toggle--active\")}\n onClick={(e) => { e.stopPropagation(); setSidebarOpen(v => !v); }}\n aria-label=\"Toggle history\"\n >\n <HistoryIcon />\n </button>\n <span className=\"hsk-cb-topbar-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </span>\n <div>\n <div className=\"hsk-cb-topbar-title\">{activeTitle}</div>\n </div>\n </div>\n <div className=\"hsk-cb-topbar-actions\">\n {replayMessages ? (\n <button className=\"hsk-cb-topbar-btn\" onClick={() => { setReplayMessages(null); }}>← Live chat</button>\n ) : (\n messages.length > 0 && (\n <button className=\"hsk-cb-topbar-btn\" onClick={handleReset}>Clear chat</button>\n )\n )}\n <button className=\"hsk-cb-close\" onClick={onClose} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n </div>\n\n {/* Replay banner */}\n {replayMessages && (\n <div className=\"hsk-cb-replay-banner\">\n <HistoryIcon />\n <span>You're viewing a past conversation.</span>\n <button onClick={() => setReplayMessages(null)}>Back to chat →</button>\n </div>\n )}\n\n {/* Messages */}\n <div className=\"hsk-cb-msgs\" ref={msgsContainerRef}>\n {displayMessages.length === 0 ? (\n <div className=\"hsk-cb-empty\">\n <div className=\"hsk-cb-empty-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </div>\n <div className=\"hsk-cb-empty-title\">Find exactly what you need</div>\n <div className=\"hsk-cb-chips\">\n {activeChips.map(chip => (\n <button\n key={chip}\n className=\"hsk-cb-chip\"\n onClick={() => handleSend(chip)}\n >\n {chip}\n </button>\n ))}\n </div>\n </div>\n ) : (\n displayMessages.map((msg: ChatMessage, idx: number) => {\n const isLast = idx === displayMessages.length - 1 && !replayMessages;\n const isUser = msg.role === 'user';\n // Strip the LLM's markdown table for compare so ComparisonMatrix isn't duplicated\n const displayContent =\n !isUser && isLast && lastIntent === 'compare' && sources.length >= 2 && !replayMessages\n ? stripMarkdownTables(msg.content)\n : msg.content;\n return (\n <div key={idx} className=\"hsk-cb-msg-group\">\n {isUser ? (\n <div className=\"hsk-cb-user-msg\">\n <div className=\"hsk-cb-user-bubble\">{msg.content}</div>\n </div>\n ) : (\n <div className=\"hsk-cb-ai-msg\">\n <div className=\"hsk-cb-ai-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </div>\n <div className=\"hsk-cb-ai-body\">\n <div className=\"hsk-cb-ai-text\">{renderMarkdown(displayContent)}</div>\n\n {/* Comparison matrix — replaces the markdown table when comparing products */}\n {isLast && lastIntent === 'compare' && sources.length >= 2 && !replayMessages && (\n <ComparisonMatrix sources={sources} defaultCurrency={defaultCurrency} />\n )}\n\n {/* Sources carousel — only after latest assistant reply, non-cart, non-compare */}\n {isLast && sources.length > 0 && lastIntent !== 'compare' && lastAction?.type !== 'request_phone' && lastAction?.type !== 'awaiting_payment' && lastAction?.type !== 'checkout' && !msg.cartSnapshot && (\n <SourcesCarousel\n sources={sources}\n defaultCurrency={defaultCurrency}\n onSelectSource={handleSourceClick}\n />\n )}\n\n {/* Cart context card — shown when the message has a cart snapshot */}\n {msg.cartSnapshot && msg.cartSnapshot.items?.length > 0 && (\n <CartContextCard\n cart={msg.cartSnapshot}\n defaultCurrency={defaultCurrency}\n />\n )}\n\n {/* Action pills — for cart-mutating responses */}\n {isLast && msg.cartSnapshot && !loading && (\n <ActionPills\n cart={msg.cartSnapshot}\n actionType={msg.actionType}\n onSend={handleSend}\n loading={loading}\n />\n )}\n\n {/* Smart context pills — for all other intents */}\n {isLast && !loading && !msg.cartSnapshot && !replayMessages && (\n <SmartContextPills\n intent={lastIntent}\n sources={sources}\n onSend={handleSend}\n loading={loading}\n />\n )}\n </div>\n </div>\n )}\n </div>\n );\n })\n )}\n\n {/* Selected product pinned card — shows while LLM fetches details */}\n {selectedProduct && loading && (\n <div\n className=\"hsk-cb-selected-product\"\n onClick={() => selectedProduct.url && window.open(selectedProduct.url, '_blank')}\n >\n {selectedProduct.image && (\n <img className=\"hsk-cb-selected-img\" src={selectedProduct.image} alt={selectedProduct.name} />\n )}\n <div className=\"hsk-cb-selected-info\">\n <div className=\"hsk-cb-selected-name\">{selectedProduct.name}</div>\n {selectedProduct.price && (\n <div className=\"hsk-cb-selected-price\">\n {selectedProduct.currency ?? defaultCurrency} {parseFloat(String(selectedProduct.price ?? '').replace(/[^0-9.]/g, '') || '0').toLocaleString()}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Typing dots — shown ONLY while waiting for the server (loading).\n Once the response arrives and token streaming begins (!loading && streaming)\n the text animates in directly with no dots visible. */}\n {loading && !streaming && (\n <div className=\"hsk-cb-typing-row\" style={{ display: 'flex', alignItems: 'flex-start', gap: '10px' }}>\n <div className=\"hsk-cb-ai-icon\" style={{ display: 'flex', alignItems: 'center', marginTop: '4px' }}>\n <SparkleIcon />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>\n <style>{`\n @keyframes hsk-pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n }\n `}</style>\n <div style={{ fontSize: '0.85rem', color: '#6b7280', fontStyle: 'italic', animation: 'hsk-pulse 1.5s infinite ease-in-out' }}>\n {LOADING_MESSAGES[loadingMessageIndex]}\n </div>\n <div className=\"hsk-cb-typing\" style={{ margin: 0, alignSelf: 'flex-start' }}>\n <div className=\"hsk-cb-dot\" />\n <div className=\"hsk-cb-dot\" />\n <div className=\"hsk-cb-dot\" />\n </div>\n </div>\n </div>\n )}\n\n {error && <div className=\"hsk-cb-error\">{getFriendlyError(error)}</div>}\n\n {/* Payment phase UIs */}\n {!replayMessages && paymentPhase === 'prompt_phone' && (\n <div className=\"hsk-cb-payment-prompt\">\n <div className=\"hsk-cb-payment-icon\">📱</div>\n <p className=\"hsk-cb-payment-label\">Enter your M-Pesa number to pay</p>\n <input\n type=\"tel\"\n className=\"hsk-cb-phone-input\"\n placeholder=\"e.g. 0712 345 678\"\n value={phoneInput}\n onChange={e => setPhoneInput(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handlePhoneSubmit()}\n />\n <button className=\"hsk-cb-pay-submit\" onClick={handlePhoneSubmit}>\n Send STK Push →\n </button>\n </div>\n )}\n\n {!replayMessages && paymentPhase === 'awaiting' && (\n <div className=\"hsk-cb-payment-prompt hsk-cb-payment-prompt--awaiting\">\n <div className=\"hsk-cb-payment-pulse-ring\" />\n <div className=\"hsk-cb-payment-icon-wrap\">\n <span style={{fontSize: '2rem'}}>📱</span>\n </div>\n <p className=\"hsk-cb-payment-label\" style={{fontWeight: 600}}>Check your phone</p>\n <p className=\"hsk-cb-payment-sub\">An M-Pesa STK push has been sent.<br/>Enter your PIN to complete payment.</p>\n <div className=\"hsk-cb-payment-dots\">\n <div className=\"hsk-cb-dot hsk-cb-dot--amber\" />\n <div className=\"hsk-cb-dot hsk-cb-dot--amber\" />\n <div className=\"hsk-cb-dot hsk-cb-dot--amber\" />\n </div>\n </div>\n )}\n\n {!replayMessages && paymentPhase === 'done' && (\n <div className=\"hsk-cb-payment-prompt hsk-cb-payment-prompt--success\">\n <div className=\"hsk-cb-payment-success-ring\" />\n <div className=\"hsk-cb-payment-icon-wrap\">\n <span style={{fontSize: '2.5rem'}}>✅</span>\n </div>\n <p className=\"hsk-cb-payment-label\">Payment complete!</p>\n <p className=\"hsk-cb-payment-sub\">Thank you for your order. A confirmation has been sent.</p>\n </div>\n )}\n\n {!replayMessages && paymentPhase === 'failed' && (\n <div className=\"hsk-cb-payment-prompt hsk-cb-payment-prompt--failed\">\n <div className=\"hsk-cb-payment-icon-wrap\">\n <span style={{fontSize: '2.5rem'}}>❌</span>\n </div>\n <p className=\"hsk-cb-payment-label\">Payment failed or timed out</p>\n <p className=\"hsk-cb-payment-sub\">Please check your M-Pesa PIN and try again, or contact support.</p>\n <div className=\"hsk-cb-payment-actions\">\n <button\n className=\"hsk-cb-pay-submit\"\n onClick={() => { setPaymentPhase('prompt_phone'); setMerchantRef(null); }}\n >\n Try again\n </button>\n <button\n className=\"hsk-cb-pay-secondary\"\n onClick={() => { setPaymentPhase('idle'); setMerchantRef(null); }}\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n <div ref={bottomRef} style={{ height: 1 }} />\n </div>\n\n {/* Input — disabled in replay mode */}\n {!replayMessages && (\n <div className=\"hsk-cb-input-wrap\">\n <div className=\"hsk-cb-input-box\">\n <textarea\n ref={textareaRef}\n className={cn(\"hsk-cb-textarea\", classNames.input)}\n value={input}\n onChange={handleInput}\n onKeyDown={handleKeyDown}\n placeholder={activePlaceholder}\n rows={1}\n disabled={loading}\n autoFocus\n />\n <button\n className={cn(\"hsk-cb-send\", classNames.sendButton)}\n onClick={() => handleSend()}\n disabled={!input.trim() || loading}\n aria-label=\"Send message\"\n >\n <ArrowUpIcon />\n </button>\n </div>\n <div className=\"hsk-cb-hint\">Akropolys AI · searches the whole catalogue in real time</div>\n </div>\n )}\n\n </div>{/* end .hsk-cb-main */}\n\n </div>\n </div>\n );\n}\n\n// ─── KikuButton (public export) ─────────────────────────────────────────────\n\nexport function KikuButton({\n label,\n title,\n placeholder,\n backdropColor,\n backdropBlur,\n className,\n onSelectSource,\n defaultCurrency,\n chips,\n theme,\n classNames = {},\n}: KikuButtonProps) {\n const [open, setOpen] = useState(false);\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n\n if (typeof window !== 'undefined' && !(window as any).__akropolys_nav_patched) {\n (window as any).__akropolys_nav_patched = true;\n const originalPush = window.history.pushState;\n const originalReplace = window.history.replaceState;\n\n window.history.pushState = function(...args) {\n originalPush.apply(this, args);\n window.dispatchEvent(new CustomEvent('akropolys:navigation'));\n };\n\n window.history.replaceState = function(...args) {\n originalReplace.apply(this, args);\n window.dispatchEvent(new CustomEvent('akropolys:navigation'));\n };\n }\n\n const handleNavigation = () => {\n setOpen(false);\n };\n\n window.addEventListener('popstate', handleNavigation);\n window.addEventListener('akropolys:navigation', handleNavigation);\n\n return () => {\n window.removeEventListener('popstate', handleNavigation);\n window.removeEventListener('akropolys:navigation', handleNavigation);\n };\n }, []);\n\n const isStringTheme = typeof theme === 'string';\n const hskThemeAttr = isStringTheme ? theme : undefined;\n\n const customStyles = (!isStringTheme && theme) ? {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties : undefined;\n\n return (\n <>\n <button\n className={cn(\"hsk-cb-btn\", classNames.button, className)}\n onClick={() => setOpen(true)}\n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n aria-label=\"Open AI chat\"\n >\n <span className=\"hsk-cb-btn-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </span>\n {label !== undefined ? label : null}\n </button>\n {open && mounted && createPortal(\n <ChatModal\n title={title}\n placeholder={placeholder}\n backdropColor={backdropColor}\n backdropBlur={backdropBlur}\n onClose={() => setOpen(false)}\n onSelectSource={onSelectSource}\n defaultCurrency={defaultCurrency}\n chips={chips}\n theme={theme}\n classNames={classNames}\n />,\n document.body\n )}\n </>\n );\n}\n","import React from 'react';\nimport type { ChatSource } from '@akropolys/sdk';\n\ninterface ComparisonMatrixProps {\n sources: ChatSource[];\n defaultCurrency?: string;\n}\n\n// ── Spec parsers ──────────────────────────────────────────────────────────────\n\nfunction extractSize(p: ChatSource): string | null {\n const name = p.name;\n const cat = (p.category || '').toLowerCase();\n \n // 1. If there's an explicit unit like \" or inch(es)\n const mExplicit = name.match(/(\\d+(?:\\.\\d+)?)\\s*(?:inch(?:es)?|[\"'″])/i);\n if (mExplicit) {\n return `${mExplicit[1]} inches`;\n }\n \n // 2. If it is a TV and contains a 2-digit size (like 43 in Hisense 43A4K)\n if (cat.includes('tv') || cat.includes('audio')) {\n const mTv = name.match(/\\b(\\d{2})(?:[a-zA-Z]|\\b)/);\n if (mTv) {\n const size = parseInt(mTv[1], 10);\n if (size >= 24 && size <= 120) {\n return `${size} inches`;\n }\n }\n }\n \n return null;\n}\nfunction extractResolution(name: string): string | null {\n if (/\\b4K\\b/i.test(name)) return '4K Ultra HD (2160p)';\n if (/\\bUHD\\b/i.test(name)) return 'Ultra HD (2160p)';\n if (/\\b(?:Full HD|FHD|1080p)\\b/i.test(name)) return 'Full HD (1080p)';\n if (/\\b(?:HD|720p)\\b/i.test(name)) return 'HD (720p)';\n return null;\n}\nfunction extractStorage(name: string): string | null {\n const m = name.match(/(\\d+)\\s*GB(?!\\s*RAM)/i);\n return m ? `${m[1]} GB` : null;\n}\nfunction extractRAM(name: string): string | null {\n const m = name.match(/(\\d+)\\s*GB\\s*RAM/i);\n return m ? `${m[1]} GB` : null;\n}\nfunction extractCamera(name: string): string | null {\n const m = name.match(/(\\d+)\\s*MP/i);\n return m ? `${m[1]} MP` : null;\n}\nfunction extractBattery(name: string): string | null {\n const m = name.match(/(\\d{3,5})\\s*mAh/i);\n return m ? `${m[1]} mAh` : null;\n}\n\n// ── Row types ─────────────────────────────────────────────────────────────────\n\ninterface Row {\n label: string;\n values: (string | null)[];\n type?: 'image' | 'price' | 'availability' | 'text';\n bestIdx?: number;\n}\n\nfunction buildRows(products: ChatSource[], currency: string): Row[] {\n const rows: Row[] = [];\n\n // Image preview\n rows.push({\n label: 'Product Preview',\n values: products.map(s => s.image || null),\n type: 'image',\n });\n\n // Price (lowest = best)\n const prices = products.map(s => {\n const n = parseFloat(String(s.price ?? '').replace(/[^0-9.]/g, ''));\n return isNaN(n) ? null : n;\n });\n const priceLabels = products.map((s, i) => {\n const c = s.currency || currency;\n const n = prices[i];\n return n !== null\n ? `${c} ${n.toLocaleString('en-KE', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`\n : null;\n });\n const validPrices = prices.filter((p): p is number => p !== null);\n const minPrice = validPrices.length ? Math.min(...validPrices) : null;\n rows.push({\n label: 'Price',\n values: priceLabels,\n type: 'price',\n bestIdx: minPrice !== null ? prices.indexOf(minPrice) : undefined,\n });\n\n // Brand\n const brands = products.map(s => s.brand || null);\n if (brands.some(Boolean)) rows.push({ label: 'Brand', values: brands });\n\n // Spec rows — only include if at least one product has a value\n const specDefs: { label: string; fn: (p: ChatSource) => string | null; higherIsBetter?: boolean }[] = [\n { label: 'Display Size', fn: extractSize },\n { label: 'Resolution', fn: p => extractResolution(p.name), higherIsBetter: true },\n { label: 'Storage', fn: p => extractStorage(p.name), higherIsBetter: true },\n { label: 'RAM', fn: p => extractRAM(p.name), higherIsBetter: true },\n { label: 'Camera', fn: p => extractCamera(p.name), higherIsBetter: true },\n { label: 'Battery', fn: p => extractBattery(p.name), higherIsBetter: true },\n ];\n\n const resOrder = ['4K Ultra HD (2160p)', 'Ultra HD (2160p)', 'Full HD (1080p)', 'HD (720p)'];\n\n for (const { label, fn, higherIsBetter } of specDefs) {\n const vals = products.map(s => fn(s));\n if (!vals.some(Boolean)) continue;\n\n let bestIdx: number | undefined;\n if (higherIsBetter && vals.filter(Boolean).length > 1) {\n if (label === 'Resolution') {\n bestIdx = vals.reduce((best, v, i) => {\n const rank = resOrder.indexOf(v ?? '');\n const bestRank = resOrder.indexOf(vals[best] ?? '');\n return rank !== -1 && (bestRank === -1 || rank < bestRank) ? i : best;\n }, 0);\n } else {\n // Numeric comparison — higher wins\n const nums = vals.map(v => parseFloat((v ?? '').replace(/[^0-9.]/g, '')));\n const max = Math.max(...nums.filter(n => !isNaN(n)));\n bestIdx = nums.indexOf(max);\n }\n }\n rows.push({ label, values: vals, bestIdx });\n }\n\n // Availability\n const avail = products.map(s => {\n const a = s.availability ?? '';\n if (!a) return null;\n if (/in.?stock/i.test(a)) return 'In-Stock';\n if (/out.?of.?stock/i.test(a)) return 'Out of Stock';\n return a;\n });\n if (avail.some(Boolean)) {\n rows.push({ label: 'Availability', values: avail, type: 'availability' });\n }\n\n // Category\n const cats = products.map(s => s.category || null);\n if (cats.some(Boolean)) rows.push({ label: 'Category', values: cats });\n\n return rows;\n}\n\n// ── Sub-renderers ─────────────────────────────────────────────────────────────\n\nfunction ImageCell({ value, name }: { value: string | null; name: string }) {\n if (!value) {\n return <div style={{ fontSize: 28, textAlign: 'center' }}>📦</div>;\n }\n return (\n <img\n src={value}\n alt={name}\n style={{\n width: 72,\n height: 72,\n objectFit: 'contain',\n borderRadius: 8,\n background: '#f5f5f5',\n display: 'block',\n }}\n />\n );\n}\n\nfunction AvailabilityCell({ value }: { value: string | null }) {\n if (!value) return <span style={{ color: '#9ca3af' }}>—</span>;\n const inStock = /in.?stock/i.test(value);\n return (\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 13, color: 'var(--hsk-text, #111827)' }}>\n <span style={{\n width: 8, height: 8, borderRadius: '50%', flexShrink: 0,\n background: inStock ? '#22c55e' : '#ef4444',\n boxShadow: inStock ? '0 0 0 3px rgba(34,197,94,0.2)' : '0 0 0 3px rgba(239,68,68,0.2)',\n display: 'inline-block',\n }} />\n {value}\n </span>\n );\n}\n\n// ── Main component ────────────────────────────────────────────────────────────\n\nexport function ComparisonMatrix({ sources, defaultCurrency = 'KES' }: ComparisonMatrixProps) {\n if (sources.length < 2) return null;\n\n const products = sources.slice(0, 3);\n const rows = buildRows(products, defaultCurrency);\n\n const colTemplate = `140px repeat(${products.length}, 1fr)`;\n\n const labelStyle: React.CSSProperties = {\n padding: '10px 12px',\n fontSize: 11,\n fontWeight: 700,\n // Solid dark fallback — never inherit a muted ancestor color\n color: 'var(--hsk-text-muted, #4b5563)',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n borderBottom: '1px solid var(--hsk-border, rgba(0,0,0,0.07))',\n verticalAlign: 'middle',\n whiteSpace: 'nowrap',\n display: 'flex',\n alignItems: 'center',\n };\n\n const cellBase: React.CSSProperties = {\n padding: '10px 14px',\n fontSize: 13,\n // Explicit color so cells are always readable regardless of parent theme\n color: 'var(--hsk-text, #111827)',\n borderBottom: '1px solid var(--hsk-border, rgba(0,0,0,0.07))',\n verticalAlign: 'middle',\n display: 'flex',\n alignItems: 'center',\n };\n\n return (\n <div\n className=\"hsk-compare-matrix\"\n style={{\n marginTop: 10,\n borderRadius: 12,\n overflow: 'hidden',\n border: '1px solid var(--hsk-border, rgba(0,0,0,0.09))',\n background: 'var(--hsk-surface, #fff)',\n fontSize: 13,\n }}\n >\n {/* ── Header ── */}\n <div style={{ display: 'grid', gridTemplateColumns: colTemplate, background: 'var(--hsk-surface2, #f9fafb)', borderBottom: '2px solid var(--hsk-border, rgba(0,0,0,0.09))' }}>\n <div style={{ ...labelStyle, borderBottom: 'none', color: 'var(--hsk-text, #111)', fontSize: 12 }}>Feature</div>\n {products.map((p, i) => (\n <a\n key={i}\n href={p.url || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: '10px 14px',\n fontSize: 12,\n fontWeight: 700,\n color: 'var(--hsk-primary, #16a34a)',\n textDecoration: 'none',\n lineHeight: 1.3,\n borderLeft: i > 0 ? '1px solid var(--hsk-border, rgba(0,0,0,0.07))' : 'none',\n }}\n >\n {p.name}\n </a>\n ))}\n </div>\n\n {/* ── Data rows ── */}\n {rows.map((row, rowIdx) => (\n <div\n key={rowIdx}\n style={{\n display: 'grid',\n gridTemplateColumns: colTemplate,\n background: rowIdx % 2 === 1 ? 'var(--hsk-surface2, rgba(0,0,0,0.015))' : 'transparent',\n }}\n >\n {/* Label */}\n <div style={labelStyle}>{row.label}</div>\n\n {/* Values */}\n {products.map((p, i) => {\n const val = row.values[i];\n const isBest = row.bestIdx === i && row.values.filter(Boolean).length > 1;\n\n if (row.type === 'image') {\n return (\n <div key={i} style={{ ...cellBase, justifyContent: 'center', padding: '12px', borderLeft: i > 0 ? '1px solid var(--hsk-border, rgba(0,0,0,0.07))' : 'none' }}>\n <ImageCell value={val} name={p.name} />\n </div>\n );\n }\n if (row.type === 'availability') {\n return (\n <div key={i} style={{ ...cellBase, borderLeft: i > 0 ? '1px solid var(--hsk-border, rgba(0,0,0,0.07))' : 'none' }}>\n <AvailabilityCell value={val} />\n </div>\n );\n }\n return (\n <div\n key={i}\n style={{\n ...cellBase,\n fontWeight: isBest ? 700 : 400,\n // Always use a solid dark fallback — never 'inherit' which can be muted/invisible\n color: isBest\n ? 'var(--hsk-primary, #ea580c)'\n : row.type === 'price'\n ? 'var(--hsk-text, #374151)' // non-cheapest price: visible but not highlighted\n : 'var(--hsk-text, #111827)',\n borderLeft: i > 0 ? '1px solid var(--hsk-border, rgba(0,0,0,0.07))' : 'none',\n }}\n >\n {val ?? <span style={{ color: '#9ca3af' }}>—</span>}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useSearch, useKiku, useAkropolysContext } from '@akropolys/sdk';\nimport { renderMarkdown } from '../utils/markdown';\nimport { SearchResult, Product, AkropolysTheme } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\n\nexport interface SparkleProps {\n productName: string;\n limit?: number;\n onResult?: (results: SearchResult[]) => void;\n /** Override the backdrop colour (any CSS colour/gradient) */\n backdropColor?: string;\n /** Override backdrop blur — e.g. \"8px\" or 8 */\n backdropBlur?: string | number;\n /** Extra classes on the trigger button */\n className?: string;\n /** Called when user clicks a result — return false to prevent default navigation */\n onNavigate?: (result: SearchResult) => boolean | void;\n theme?: AkropolysTheme;\n classNames?: {\n button?: string;\n backdrop?: string;\n card?: string;\n item?: string;\n };\n product?: Product;\n}\n\nconst SparkleIcon = ({ className, size = 16 }: { className?: string; size?: number }) => (\n <svg\n className={cn(\"hsk-brand-a\", className)}\n width={size}\n height={size}\n viewBox=\"0 0 28 30\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-label=\"Akropolys\"\n >\n {/* Left leg: elegant thin stroke */}\n <path\n d=\"M14.5 4.5 L6.5 25\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n />\n {/* Right leg: bold ancient serif thick stroke */}\n <path\n d=\"M14.5 4.5 L22.5 25\"\n stroke=\"currentColor\"\n strokeWidth=\"4.2\"\n strokeLinecap=\"round\"\n />\n {/* Crossbar */}\n <path\n d=\"M9.5 17 H19.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n {/* Left base serif */}\n <path\n d=\"M3 25 H10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n {/* Right base serif */}\n <path\n d=\"M19 25 H26\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n {/* Smooth breathing mark (spiritus lenis) at top-left — animated */}\n <path\n d=\"M8.5 2.5 C10 2.5, 11 3.5, 11 5 C11 7, 8.5 8.5, 7.5 9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n className=\"hsk-akr-breath\"\n />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n);\n\nconst ArrowUpIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\"/>\n <path d=\"M12 19V5\"/>\n </svg>\n);\n\n/* ── Modal ────────────────────────────────────────────────────────────────── */\ninterface ModalProps extends Pick<SparkleProps, 'productName' | 'limit' | 'backdropColor' | 'backdropBlur' | 'onNavigate' | 'onResult' | 'theme' | 'classNames' | 'product'> {\n onClose: () => void;\n}\n\nconst getFriendlyError = (err: any) => {\n let str = '';\n if (typeof err === 'string') str = err;\n else if (err && typeof err === 'object' && err.message) str = err.message;\n else try { str = JSON.stringify(err); } catch { str = String(err); }\n\n if (str.toLowerCase().includes('token limit')) {\n return \"You've reached your usage limit. Please update your billing limits in your dashboard to continue.\";\n }\n\n try {\n const parsed = JSON.parse(str);\n return parsed.error || parsed.message || str;\n } catch {\n return str;\n }\n};\n\nfunction SparkleModal({ \n productName, \n limit, \n backdropColor, \n backdropBlur, \n onClose, \n onNavigate, \n onResult,\n theme,\n classNames = {},\n product: initialProduct,\n}: ModalProps) {\n const client = useAkropolysContext();\n const [fetchedProduct, setFetchedProduct] = useState<Product | null>(null);\n const displayProduct = initialProduct || fetchedProduct;\n const { results, loading: searchLoading, search } = useSearch();\n const { messages, sources, loading: chatLoading, error: chatError, send } = useKiku();\n const [chatInput, setChatInput] = useState('');\n const chatBottomRef = useRef<HTMLDivElement>(null);\n const chatTextareaRef = useRef<HTMLTextAreaElement>(null);\n\n /* auto-search and product fetching on open */\n useEffect(() => {\n if (!initialProduct && !fetchedProduct) {\n client.api.searchVector(productName, 1)\n .then(res => {\n if (res.results && res.results.length > 0) {\n setFetchedProduct(res.results[0].product);\n }\n })\n .catch(err => console.error('[Akropolys] Failed to fetch product details', err));\n }\n search(productName, limit);\n }, [productName, initialProduct, fetchedProduct, client, limit, search]);\n\n /* fire callback */\n useEffect(() => { if (results.length > 0) onResult?.(results); }, [results, onResult]);\n\n /* Escape key */\n useEffect(() => {\n const h = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', h);\n return () => document.removeEventListener('keydown', h);\n }, [onClose]);\n\n /* Scroll chat to bottom */\n useEffect(() => {\n chatBottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, chatLoading]);\n\n const blurVal = typeof backdropBlur === 'number' ? `${backdropBlur}px` : (backdropBlur ?? '16px');\n const bg = backdropColor ?? undefined;\n\n const handleNav = (r: SearchResult) => {\n const prevent = onNavigate?.(r);\n if (prevent !== false) {\n onClose();\n if (r.product.url) window.location.href = r.product.url;\n }\n };\n\n const handleSend = async (text?: string) => {\n const q = (text ?? chatInput).trim();\n if (!q || chatLoading) return;\n setChatInput('');\n if (chatTextareaRef.current) {\n chatTextareaRef.current.style.height = 'auto';\n }\n\n if (messages.length === 0 && displayProduct) {\n const contextQuery = `[Context: Shopper is viewing \"${displayProduct.name}\". Price: ${displayProduct.price}. Description: ${displayProduct.description || ''}]\\n\\nQuestion: ${q}`;\n await send(contextQuery, q);\n } else {\n await send(q);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); }\n };\n\n const handleInput = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setChatInput(e.target.value);\n const t = e.target;\n t.style.height = 'auto';\n t.style.height = `${Math.min(t.scrollHeight, 140)}px`;\n };\n\n const customStyles = {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties;\n\n const displayMessages = messages.length === 0 && displayProduct\n ? [\n {\n role: 'assistant' as const,\n content: `Hi! I can help you with **${displayProduct.name}**. Ask me about its specifications, features, compare it with other options, or find alternatives!`,\n },\n ]\n : messages;\n\n return (\n <div\n className={cn(\"hsk-sp-backdrop\", classNames.backdrop)}\n onClick={onClose}\n style={{\n backdropFilter: `blur(${blurVal})`,\n WebkitBackdropFilter: `blur(${blurVal})`,\n background: bg ?? undefined,\n ...customStyles,\n }}\n >\n <div className={cn(\"hsk-sp-card hsk-sp-fullscreen\", classNames.card)} onClick={e => e.stopPropagation()}>\n <div className=\"hsk-sp-header\">\n <span className=\"hsk-sp-header-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </span>\n <div className=\"hsk-sp-header-body\">\n <div className=\"hsk-sp-header-title\">{displayProduct?.name || productName}</div>\n <div className=\"hsk-sp-header-sub\">Ask questions, compare specs, or check similar products</div>\n </div>\n <button className=\"hsk-sp-close\" onClick={onClose} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n\n {searchLoading && <div className=\"hsk-sp-bar\" />}\n\n {/* Split pane body */}\n <div className=\"hsk-sp-body\">\n {/* Left Pane: Product Profile */}\n <div className=\"hsk-sp-details-pane\">\n {displayProduct && (\n <div className=\"hsk-sp-product-profile-container\">\n <div className=\"hsk-sp-product-profile\">\n <div className=\"hsk-sp-details-imgwrap\">\n {displayProduct.images?.[0] ? (\n <img src={displayProduct.images[0]} alt={displayProduct.name} />\n ) : (\n <span className=\"hsk-sp-img-placeholder\">🛍</span>\n )}\n </div>\n <div className=\"hsk-sp-details-meta\">\n {displayProduct.brand && <span className=\"hsk-sp-item-brand\">{displayProduct.brand}</span>}\n {displayProduct.category && <span className=\"hsk-sp-item-cat\">{displayProduct.category}</span>}\n <h2 className=\"hsk-sp-details-name\">{displayProduct.name}</h2>\n <div className=\"hsk-sp-item-price-row\">\n <span className=\"hsk-sp-item-currency\">{displayProduct.currency ?? 'KES'}</span>\n <span className=\"hsk-sp-item-price\">{parseFloat(displayProduct.price?.replace(/[^0-9.]/g, '') || '0').toLocaleString()}</span>\n {displayProduct.originalPrice && (\n <span className=\"hsk-sp-item-original-price\">\n {parseFloat(displayProduct.originalPrice.replace(/[^0-9.]/g, '') || '0').toLocaleString()}\n </span>\n )}\n {displayProduct.discount && (\n <span className=\"hsk-sp-item-discount\">({displayProduct.discount})</span>\n )}\n </div>\n \n <div className=\"hsk-sp-item-meta-badges\">\n {displayProduct.rating && (\n <span className=\"hsk-sp-meta-badge hsk-sp-meta-badge-rating\">\n ★ {parseFloat(displayProduct.rating.toString()).toFixed(1)} {displayProduct.reviewCount ? `(${displayProduct.reviewCount})` : ''}\n </span>\n )}\n {displayProduct.availability && (\n <span className={`hsk-sp-meta-badge hsk-sp-meta-badge-avail ${displayProduct.availability.toLowerCase().includes('in') ? 'in-stock' : 'out-stock'}`}>\n {displayProduct.availability}\n </span>\n )}\n {displayProduct.stock && !displayProduct.availability && (\n <span className=\"hsk-sp-meta-badge hsk-sp-meta-badge-stock\">\n Stock: {displayProduct.stock}\n </span>\n )}\n </div>\n </div>\n </div>\n\n {displayProduct.specs && Object.keys(displayProduct.specs).length > 0 && (\n <div className=\"hsk-sp-specs-horizontal\">\n {Object.entries(displayProduct.specs).map(([key, val]) => (\n <div key={key} className=\"hsk-sp-spec-item-horizontal\">\n <span className=\"hsk-sp-spec-label-horizontal\">{key}:</span>\n <span className=\"hsk-sp-spec-value-horizontal\" title={val}>{val}</span>\n </div>\n ))}\n </div>\n )}\n\n {displayProduct.description && (\n <div className=\"hsk-sp-details-desc\">\n <h4>Description</h4>\n <p>{displayProduct.description}</p>\n </div>\n )}\n </div>\n )}\n\n {/* Similar Products */}\n <div className=\"hsk-sp-similar-section\">\n <h3>Similar Products</h3>\n <div className=\"hsk-sp-results\">\n {(() => {\n const similarProducts = results.filter(\n r => {\n const isSameName = r.product.name.toLowerCase() === displayProduct?.name?.toLowerCase();\n const isSameSlug = r.product.slug && displayProduct?.slug && r.product.slug.toLowerCase() === displayProduct.slug.toLowerCase();\n return !isSameName && !isSameSlug;\n }\n );\n\n if (!searchLoading && similarProducts.length === 0) {\n return <div className=\"hsk-sp-empty\">No similar products found.</div>;\n }\n\n return similarProducts.map((r, i) => {\n const price = parseFloat(r.product.price?.replace(/[^0-9.]/g, '') || '0');\n const currency = r.product.currency ?? 'KES';\n return (\n <div\n key={r.id}\n className={cn(\"hsk-sp-item\", classNames.item)}\n style={{ animationDelay: `${i * 55}ms` }}\n >\n <div className=\"hsk-sp-img-wrap\">\n {r.product.images?.[0] ? (\n <img src={r.product.images[0]} alt={r.product.name} />\n ) : (\n <span className=\"hsk-sp-img-placeholder\">🛍</span>\n )}\n </div>\n <div className=\"hsk-sp-item-body\">\n <div>\n {r.product.category && (\n <div className=\"hsk-sp-item-cat\">{r.product.category}</div>\n )}\n <div className=\"hsk-sp-item-name\" title={r.product.name}>{r.product.name}</div>\n </div>\n <div className=\"hsk-sp-item-price-row\">\n <span className=\"hsk-sp-item-currency\">{currency}</span>\n <span className=\"hsk-sp-item-price\">{price.toLocaleString()}</span>\n </div>\n <div className=\"hsk-sp-actions\">\n <button\n className=\"hsk-sp-action hsk-sp-action-primary\"\n onClick={() => handleNav(r)}\n >\n View\n </button>\n </div>\n </div>\n </div>\n );\n });\n })()}\n </div>\n </div>\n </div>\n\n {/* Right Pane: AI Chat Assistant */}\n <div className=\"hsk-sp-chat-pane\">\n <div className=\"hsk-cb-msgs\">\n {displayMessages.map((msg, idx) => {\n const isUser = msg.role === 'user';\n return (\n <div key={idx} className=\"hsk-cb-msg-group\">\n {isUser ? (\n <div className=\"hsk-cb-user-msg\">\n <div className=\"hsk-cb-user-bubble\">{msg.content}</div>\n </div>\n ) : (\n <div className=\"hsk-cb-ai-msg\">\n <div className=\"hsk-cb-ai-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </div>\n <div className=\"hsk-cb-ai-body\">\n <div className=\"hsk-cb-ai-text\">{renderMarkdown(msg.content)}</div>\n </div>\n </div>\n )}\n </div>\n );\n })}\n\n {chatLoading && (\n <div className=\"hsk-cb-typing-row\">\n <div className=\"hsk-cb-ai-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </div>\n <div className=\"hsk-cb-typing\">\n <div className=\"hsk-cb-dot\" />\n <div className=\"hsk-cb-dot\" />\n <div className=\"hsk-cb-dot\" />\n </div>\n </div>\n )}\n\n {chatError && <div className=\"hsk-cb-error\">{getFriendlyError(chatError)}</div>}\n <div ref={chatBottomRef} style={{ height: 1 }} />\n </div>\n\n <div className=\"hsk-cb-input-wrap\">\n <div className=\"hsk-cb-input-box\">\n <textarea\n ref={chatTextareaRef}\n className=\"hsk-cb-textarea\"\n value={chatInput}\n onChange={handleInput}\n onKeyDown={handleKeyDown}\n placeholder=\"Ask about this product, specs, or comparison...\"\n rows={1}\n disabled={chatLoading}\n />\n <button\n className=\"hsk-cb-send\"\n onClick={() => handleSend()}\n disabled={!chatInput.trim() || chatLoading}\n aria-label=\"Send message\"\n >\n <ArrowUpIcon />\n </button>\n </div>\n <div className=\"hsk-cb-hint\">Akropolys &middot; instant product knowledge</div>\n </div>\n </div>\n </div>\n\n <div className=\"hsk-sp-footer\">\n <span className=\"hsk-sp-esc\">Esc to close</span>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Exported component ───────────────────────────────────────────────────── */\nexport function Sparkle({ \n productName, \n limit = 8, \n onResult, \n backdropColor, \n backdropBlur, \n className, \n onNavigate,\n theme,\n classNames = {},\n product,\n}: SparkleProps) {\n const [open, setOpen] = useState(false);\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => { setMounted(true); }, []);\n\n const customStyles = {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties;\n\n return (\n <>\n <button\n className={cn(\"hsk-sp-btn\", classNames.button, className)}\n onClick={() => setOpen(true)}\n style={customStyles}\n title=\"Find similar products\"\n aria-label=\"Find similar products\"\n >\n <SparkleIcon />\n </button>\n {open && mounted && createPortal(\n <SparkleModal\n productName={productName}\n limit={limit}\n onResult={onResult}\n backdropColor={backdropColor}\n backdropBlur={backdropBlur}\n onClose={() => setOpen(false)}\n onNavigate={onNavigate}\n theme={theme}\n classNames={classNames}\n product={product}\n />,\n document.body\n )}\n </>\n );\n}\n","import React from 'react';\nimport { useCart } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\n\nexport function CartBadge({ className }: { className?: string }) {\n const { cart } = useCart();\n \n if (!cart || cart.item_count === 0) return null;\n \n return (\n <span className={cn(\"hsk-cart-badge\", className)}>\n {cart.item_count}\n </span>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useCart, useAkropolysContext, AkropolysTheme } from '@akropolys/sdk';\nimport { CheckoutModal } from './CheckoutModal';\nimport { cn } from '../utils/cn';\n\nexport function CartDrawer({ \n trigger, \n className,\n theme \n}: { \n trigger?: React.ReactNode, \n className?: string,\n theme?: 'light' | 'dark' | AkropolysTheme \n}) {\n const { cart, loading } = useCart();\n const [open, setOpen] = useState(false);\n const [showCheckout, setShowCheckout] = useState(false);\n const [mounted, setMounted] = useState(false);\n const client = useAkropolysContext();\n\n useEffect(() => {\n setMounted(true);\n const handleTriggerCheckout = () => {\n setShowCheckout(true);\n setOpen(false);\n };\n window.addEventListener('akropolys:trigger_checkout', handleTriggerCheckout);\n return () => {\n window.removeEventListener('akropolys:trigger_checkout', handleTriggerCheckout);\n };\n }, []);\n\n // Block body scroll when drawer is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => { document.body.style.overflow = ''; };\n }, [open]);\n\n const handleCheckout = async () => {\n if (!cart || cart.items.length === 0) return;\n \n const event = new CustomEvent('akropolys:trigger_checkout', { cancelable: true });\n window.dispatchEvent(event);\n \n if (event.defaultPrevented) {\n setOpen(false);\n return;\n }\n \n setShowCheckout(true);\n };\n\n const isStringTheme = typeof theme === 'string';\n const hskThemeAttr = isStringTheme ? theme : undefined;\n \n const customStyles = (!isStringTheme && theme) ? {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor, '--hsk-primary-color': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties : undefined;\n\n return (\n <>\n {trigger ? (\n <div onClick={() => setOpen(true)} style={{ display: 'inline-block' }}>\n {trigger}\n </div>\n ) : (\n <button \n onClick={() => setOpen(true)}\n className={cn(\"hsk-cart-trigger\", className)} \n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n aria-label=\"Open cart\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"9\" cy=\"21\" r=\"1\"></circle>\n <circle cx=\"20\" cy=\"21\" r=\"1\"></circle>\n <path d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"></path>\n </svg>\n {cart && cart.item_count > 0 ? (\n <span className=\"hsk-cart-trigger-badge\">{cart.item_count}</span>\n ) : null}\n </button>\n )}\n \n {open && mounted && createPortal(\n <div \n className=\"hsk-cart-backdrop\" \n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n onClick={() => setOpen(false)}\n >\n <div \n className=\"hsk-cart-bottom-sheet\" \n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"hsk-cart-sheet-handle\" />\n \n <div className=\"hsk-cart-sheet-header\">\n <h2>Your Cart</h2>\n <button onClick={() => setOpen(false)} className=\"hsk-close-btn\">&times;</button>\n </div>\n \n <div className=\"hsk-cart-sheet-content\">\n {loading && !cart ? (\n <div className=\"hsk-cart-loading\">Loading cart...</div>\n ) : !cart || cart.items.length === 0 ? (\n <div className=\"hsk-cart-empty\">Your cart is empty.</div>\n ) : (\n <ul className=\"hsk-cart-items\">\n {cart.items.map(item => (\n <li key={item.id} className=\"hsk-cart-item\">\n {item.image && <img src={item.image} alt={item.name} className=\"hsk-cart-item-img\" />}\n <div className=\"hsk-cart-item-info\">\n <span className=\"hsk-cart-item-name\">{item.name}</span>\n <span className=\"hsk-cart-item-price\">{item.currency} {item.price_numeric.toLocaleString(undefined, { minimumFractionDigits: 2 })}</span>\n </div>\n <div className=\"hsk-cart-item-qty\">x{item.quantity}</div>\n </li>\n ))}\n </ul>\n )}\n </div>\n \n {cart && cart.items.length > 0 && (\n <div className=\"hsk-cart-sheet-footer\">\n <div className=\"hsk-cart-total\">\n <span>Total</span>\n <span>{cart.currency} {cart.total.toLocaleString(undefined, { minimumFractionDigits: 2 })}</span>\n </div>\n <button onClick={handleCheckout} className=\"hsk-checkout-btn\">\n Checkout securely\n </button>\n </div>\n )}\n </div>\n </div>,\n document.body\n )}\n\n {showCheckout && mounted && (\n <CheckoutModal \n onClose={() => {\n setShowCheckout(false);\n setOpen(false);\n }}\n theme={isStringTheme ? (theme as string) : undefined}\n customStyles={customStyles}\n hskThemeAttr={hskThemeAttr}\n />\n )}\n </>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useCart, useAkropolysContext, usePaymentPolling } from '@akropolys/sdk';\n\ntype Phase = 'idle' | 'awaiting' | 'done' | 'failed' | 'cancelled';\n\nexport function CheckoutModal({\n onClose,\n theme,\n customStyles,\n hskThemeAttr\n}: {\n onClose: () => void;\n theme?: string;\n customStyles?: React.CSSProperties;\n hskThemeAttr?: string;\n}) {\n const { cart, loading: cartLoading } = useCart();\n const client = useAkropolysContext();\n const [config, setConfig] = useState<any>(null);\n const [loadingConfig, setLoadingConfig] = useState(true);\n\n // Form fields prefilled from localStorage\n const [phone, setPhone] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_phone') || '';\n }\n return '';\n });\n const [email, setEmail] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_email') || '';\n }\n return '';\n });\n const [firstName, setFirstName] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_firstname') || '';\n }\n return '';\n });\n const [lastName, setLastName] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_lastname') || '';\n }\n return '';\n });\n\n // Payment state\n const [phase, setPhase] = useState<Phase>('idle');\n const [merchantRef, setMerchantRef] = useState<string | null>(null);\n const [payError, setPayError] = useState<string | null>(null);\n\n // Poll for payment confirmation\n const { } = usePaymentPolling({\n client: client.api,\n merchantReference: merchantRef,\n onSuccess: () => { setPhase('done'); setMerchantRef(null); },\n onFailure: () => {\n setPhase('failed');\n setPayError('Payment failed or timed out. Please try again.');\n setMerchantRef(null);\n },\n });\n\n useEffect(() => {\n client.api.getCheckoutConfig()\n .then(res => setConfig(res.payment_methods))\n .catch(() => {})\n .finally(() => setLoadingConfig(false));\n }, [client]);\n\n const hasPaymentMethods = config && Object.values(config).some((m: any) => m.enabled);\n\n const handlePay = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!phone.trim()) { setPayError('Phone number is required.'); return; }\n setPayError(null);\n setPhase('awaiting');\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem('akropolys_user_phone', phone.trim());\n localStorage.setItem('akropolys_user_email', email.trim());\n localStorage.setItem('akropolys_user_firstname', firstName.trim());\n localStorage.setItem('akropolys_user_lastname', lastName.trim());\n }\n const res = await client.api.initiatePayment(phone.trim(), email, firstName, lastName);\n if (res?.merchantReference) {\n setMerchantRef(res.merchantReference);\n } else {\n throw new Error('No merchant reference returned.');\n }\n } catch (err: any) {\n setPhase('failed');\n setPayError(err.message || 'Could not connect to payment processor.');\n }\n };\n\n const currency = cart?.currency || 'KES';\n const total = cart?.total || 0;\n\n const backdropStyle: React.CSSProperties = { ...customStyles, fontSize: '15px', fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif', zIndex: 999999 };\n\n return createPortal(\n <div\n className=\"hsk-checkout-backdrop-full\"\n style={backdropStyle}\n data-hsk-theme={hskThemeAttr}\n >\n <div\n className=\"hsk-checkout-modal-full\"\n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n >\n <button \n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onClose(); }} \n className=\"hsk-checkout-close-x\"\n aria-label=\"Close checkout\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n\n {/* Left Panel: Order Summary */}\n <div className=\"hsk-checkout-panel-left\">\n <div className=\"hsk-checkout-left-content\">\n <button onClick={(e) => { e.preventDefault(); e.stopPropagation(); onClose(); }} className=\"hsk-checkout-back-btn\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\n <polyline points=\"12 19 5 12 12 5\"></polyline>\n </svg>\n Back to store\n </button>\n \n <div className=\"hsk-checkout-store-info\">\n <h2>Secure Checkout</h2>\n </div>\n \n <div className=\"hsk-checkout-amount-due\">\n <span className=\"hsk-checkout-label-muted\">Pay total</span>\n <div className=\"hsk-checkout-grand-total\">\n {currency} {total.toLocaleString(undefined, { minimumFractionDigits: 2 })}\n </div>\n </div>\n \n {cartLoading || !cart ? (\n <p className=\"hsk-cart-loading\">Loading order...</p>\n ) : (\n <div className=\"hsk-checkout-items-list-wrap\">\n <ul className=\"hsk-checkout-items-list\">\n {cart.items.map(item => (\n <li key={item.id} className=\"hsk-checkout-item-row\">\n <div className=\"hsk-checkout-item-img-container\">\n {item.image ? (\n <img src={item.image} alt={item.name} className=\"hsk-checkout-item-img\" />\n ) : (\n <div className=\"hsk-checkout-item-img-placeholder\">🛒</div>\n )}\n <span className=\"hsk-checkout-item-qty-badge\">{item.quantity}</span>\n </div>\n <div className=\"hsk-checkout-item-details\">\n <span className=\"hsk-checkout-item-name\">{item.name}</span>\n </div>\n <span className=\"hsk-checkout-item-price\">\n {item.currency} {(item.price_numeric * item.quantity).toLocaleString(undefined, { minimumFractionDigits: 2 })}\n </span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n\n {/* Right Panel: Payment Forms & Status */}\n <div className=\"hsk-checkout-panel-right\">\n <div className=\"hsk-checkout-right-content\">\n {phase === 'done' ? (\n <div className=\"hsk-checkout-status-card success\">\n <div className=\"hsk-status-icon-wrap success\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n </div>\n <h3>Payment Successful!</h3>\n <p>Your transaction has been confirmed. Thank you for your order!</p>\n <button onClick={onClose} className=\"hsk-pay-btn hsk-btn-primary\" style={{ marginTop: '1.5rem' }}>\n Continue Shopping\n </button>\n </div>\n ) : phase === 'awaiting' ? (\n <div className=\"hsk-checkout-status-card awaiting\">\n <div className=\"hsk-status-spinner-wrap\">\n <div className=\"hsk-status-spinner\"></div>\n </div>\n <h3>Confirm payment on your phone</h3>\n <p>We've sent an M-Pesa STK push prompt to <strong>254{phone}</strong>.</p>\n <div className=\"hsk-checkout-stk-instructions\">\n <p>1. Check your phone lockscreen for the M-Pesa prompt.</p>\n <p>2. Enter your M-Pesa PIN and press OK.</p>\n <p>3. Wait here — this page auto-updates once confirmed.</p>\n </div>\n <button\n onClick={() => { setPhase('cancelled'); setMerchantRef(null); }}\n className=\"hsk-checkout-cancel-btn\"\n >\n Cancel payment\n </button>\n </div>\n ) : phase === 'cancelled' ? (\n <div className=\"hsk-checkout-status-card cancelled\">\n <div className=\"hsk-status-icon-wrap cancelled\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m15 9-6 6M9 9l6 6\"/>\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n </svg>\n </div>\n <h3>Payment Cancelled</h3>\n <p>No charge was made. You can update your phone number and try again whenever you're ready.</p>\n <div className=\"hsk-checkout-status-actions\">\n <button onClick={() => { setPhase('idle'); setPayError(null); }} className=\"hsk-pay-btn hsk-btn-primary\">\n Try again\n </button>\n <button onClick={onClose} className=\"hsk-checkout-cancel-btn\">\n Back to cart\n </button>\n </div>\n </div>\n ) : phase === 'failed' ? (\n <div className=\"hsk-checkout-status-card failed\">\n <div className=\"hsk-status-icon-wrap failed\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n </div>\n <h3>Payment Failed</h3>\n <p className=\"hsk-checkout-error-text\">{payError || 'Could not verify M-Pesa transaction. Please check your phone and try again.'}</p>\n <div className=\"hsk-checkout-status-actions\">\n <button onClick={() => { setPhase('idle'); setPayError(null); }} className=\"hsk-pay-btn hsk-btn-primary\">\n Try again\n </button>\n <button onClick={onClose} className=\"hsk-checkout-cancel-btn\">\n Back to cart\n </button>\n </div>\n </div>\n ) : (\n <div className=\"hsk-checkout-payment-form-wrap\">\n <h3 className=\"hsk-checkout-section-title\">Payment details</h3>\n {loadingConfig ? (\n <p className=\"hsk-cart-loading\">Loading payment configuration...</p>\n ) : !hasPaymentMethods ? (\n <p className=\"hsk-checkout-error\">No payment methods configured for this store.</p>\n ) : (\n <form onSubmit={handlePay} className=\"hsk-stripe-checkout-form\">\n \n {/* Phone field */}\n <div className=\"hsk-form-group\">\n <label className=\"hsk-form-label\">M-Pesa Mobile Number</label>\n <div className=\"hsk-phone-input-container\">\n <span className=\"hsk-phone-prefix\">254</span>\n <input\n type=\"tel\"\n required\n placeholder=\"712345678\"\n pattern=\"[0-9]{9}\"\n maxLength={9}\n value={phone}\n onChange={e => setPhone(e.target.value.replace(/\\D/g, ''))}\n className=\"hsk-phone-input-field\"\n />\n </div>\n <span className=\"hsk-form-hint\">Enter your 9-digit number (e.g. 712345678)</span>\n </div>\n\n {/* Email field */}\n <div className=\"hsk-form-group\">\n <label className=\"hsk-form-label\">Email address</label>\n <input\n type=\"email\"\n placeholder=\"john.doe@example.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n className=\"hsk-form-input\"\n />\n </div>\n\n {/* Name row */}\n <div className=\"hsk-form-row\">\n <div className=\"hsk-form-group\">\n <label className=\"hsk-form-label\">First Name</label>\n <input\n type=\"text\"\n placeholder=\"John\"\n value={firstName}\n onChange={e => setFirstName(e.target.value)}\n className=\"hsk-form-input\"\n />\n </div>\n <div className=\"hsk-form-group\">\n <label className=\"hsk-form-label\">Last Name</label>\n <input\n type=\"text\"\n placeholder=\"Doe\"\n value={lastName}\n onChange={e => setLastName(e.target.value)}\n className=\"hsk-form-input\"\n />\n </div>\n </div>\n\n {payError && (\n <div className=\"hsk-form-error-banner\">\n {payError}\n </div>\n )}\n\n <button type=\"submit\" className=\"hsk-checkout-submit-btn\">\n Pay {currency} {total.toLocaleString()}\n </button>\n \n <div className=\"hsk-checkout-footer-brand\">\n <span>Powered by Akropolys</span>\n </div>\n </form>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}\n"],"mappings":"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","names":["useState","useRef","useEffect","Fragment","jsx","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","useRef","useKiku","useAkropolysContext","jsx","jsxs","Fragment","jsx","jsxs","SparkleIcon","ArrowUpIcon","useAkropolysContext","useRef","useState","useEffect","useKiku","useState","useEffect","useRef","createPortal","useSearch","useKiku","useAkropolysContext","Fragment","jsx","jsxs","SparkleIcon","CloseIcon","ArrowUpIcon","getFriendlyError","useAkropolysContext","useState","useSearch","useKiku","useRef","useEffect","createPortal","jsx","useState","useEffect","createPortal","useCart","useAkropolysContext","useState","useEffect","createPortal","useCart","useAkropolysContext","usePaymentPolling","jsx","jsxs","Fragment","jsx","jsxs","useCart","useState","useAkropolysContext","useEffect","createPortal"]}
1
+ {"version":3,"sources":["../src/components/SearchBar.tsx","../src/utils/cn.ts","../src/components/ChatWidget.tsx","../src/utils/markdown.tsx","../src/components/KikuButton.tsx","../src/components/ComparisonMatrix.tsx","../src/components/Sparkle.tsx","../src/components/CartBadge.tsx","../src/components/CartDrawer.tsx","../src/components/CheckoutModal.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\nimport { useSearch, SearchResult, AkropolysTheme, useAkropolysContext } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\n\nexport interface SearchBarProps {\n placeholder?: string;\n limit?: number;\n /** Debounce in ms — default 300 for smooth type-ahead */\n debounceMs?: number;\n onSelect?: (result: SearchResult) => void;\n className?: string;\n inputClassName?: string;\n dropdownClassName?: string;\n renderResult?: (result: SearchResult) => React.ReactNode;\n theme?: AkropolysTheme;\n classNames?: {\n root?: string;\n input?: string;\n dropdown?: string;\n row?: string;\n };\n}\n\n/* SVG search glass — pure inline so no icon dependency */\nconst SearchIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\"/>\n <line x1=\"13\" y1=\"13\" x2=\"18\" y2=\"18\"/>\n </svg>\n);\n\nexport function SearchBar({\n placeholder = 'Search products…',\n limit = 10,\n debounceMs = 300,\n onSelect,\n className,\n inputClassName,\n dropdownClassName,\n renderResult,\n theme,\n classNames = {},\n}: SearchBarProps) {\n const [query, setQuery] = useState('');\n const [open, setOpen] = useState(false);\n const [isDebouncing, setIsDebouncing] = useState(false);\n const { results, loading, search, clear } = useSearch();\n const client = useAkropolysContext();\n const timer = useRef<ReturnType<typeof setTimeout>>();\n const wrap = useRef<HTMLDivElement>(null);\n const ignoreNextQueryChange = useRef(false);\n\n /* Debounce search — but keep stale results visible between calls */\n useEffect(() => {\n if (ignoreNextQueryChange.current) {\n ignoreNextQueryChange.current = false;\n return;\n }\n clearTimeout(timer.current);\n if (!query.trim()) {\n clear();\n setOpen(false);\n setIsDebouncing(false);\n return;\n }\n setOpen(true); // open immediately (stale results show while fetching)\n setIsDebouncing(true);\n timer.current = setTimeout(() => {\n setIsDebouncing(false);\n search(query, limit);\n }, debounceMs);\n return () => clearTimeout(timer.current);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n /* Click-outside to close */\n useEffect(() => {\n const h = (e: MouseEvent) => {\n if (wrap.current && !wrap.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', h);\n return () => document.removeEventListener('mousedown', h);\n }, []);\n\n const handleSelect = (r: SearchResult) => {\n if (query.trim()) {\n client.api.searchVector(query, 1).catch(() => {});\n }\n ignoreNextQueryChange.current = true;\n setOpen(false);\n setQuery(r.product.name);\n onSelect?.(r);\n };\n\n const handleCommitSearch = () => {\n if (!query.trim()) return;\n client.api.searchVector(query, 1).catch(() => {});\n if (results.length > 0) {\n handleSelect(results[0]);\n }\n };\n\n const showDrop = open && query.trim().length > 0;\n\n const customStyles = {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties;\n\n return (\n <div className={cn(\"hsk-sb-wrap\", classNames.root, className)} ref={wrap} style={customStyles}>\n <span className=\"hsk-sb-icon\"><SearchIcon /></span>\n <input\n className={cn(\"hsk-sb-input\", classNames.input, inputClassName)}\n type=\"text\"\n value={query}\n placeholder={placeholder}\n onChange={e => setQuery(e.target.value)}\n onFocus={() => results.length > 0 && query.trim() && setOpen(true)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleCommitSearch();\n }\n }}\n autoComplete=\"off\"\n spellCheck={false}\n />\n {showDrop && (\n <div className={cn(\"hsk-sb-drop\", classNames.dropdown, dropdownClassName)} style={{ position: 'absolute' }}>\n {(loading || isDebouncing) && <div className=\"hsk-sb-loading-bar\" />}\n\n {(loading || isDebouncing) && results.length === 0 ? (\n <>\n <div className=\"hsk-sb-skeleton-row\">\n <span className=\"hsk-sb-skeleton-icon\" />\n <div className=\"hsk-sb-row-body\">\n <div className=\"hsk-sb-skeleton-text1\" />\n <div className=\"hsk-sb-skeleton-text2\" />\n </div>\n </div>\n <div className=\"hsk-sb-skeleton-row\">\n <span className=\"hsk-sb-skeleton-icon\" />\n <div className=\"hsk-sb-row-body\">\n <div className=\"hsk-sb-skeleton-text1\" style={{ width: '45%' }} />\n <div className=\"hsk-sb-skeleton-text2\" style={{ width: '25%' }} />\n </div>\n </div>\n </>\n ) : (\n <>\n {results.length === 0 && !loading && !isDebouncing && (\n <div className=\"hsk-sb-empty\">No results for &ldquo;{query}&rdquo;</div>\n )}\n\n {results.map((r, i) => (\n renderResult ? (\n <div\n key={r.id}\n onClick={() => handleSelect(r)}\n className=\"hsk-sb-fade\"\n style={{ animationDelay: `${i * 18}ms` }}\n >\n {renderResult(r)}\n </div>\n ) : (\n <div\n key={r.id}\n className={cn(\"hsk-sb-row hsk-sb-fade\", classNames.row)}\n style={{ animationDelay: `${i * 18}ms` }}\n onClick={() => handleSelect(r)}\n >\n <span className=\"hsk-sb-row-icon\"><SearchIcon /></span>\n <div className=\"hsk-sb-row-body\">\n <div className=\"hsk-sb-row-title\">{r.product.name}</div>\n {(r.product.category || r.product.brand) && (\n <div className=\"hsk-sb-row-sub\">\n {r.product.category ?? r.product.brand}\n </div>\n )}\n </div>\n </div>\n )\n ))}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merges Tailwind classes intelligently, allowing overrides.\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useKiku, ChatMessage, ChatSource } from '@akropolys/sdk';\nimport { renderMarkdown } from '../utils/markdown';\nimport { AkropolysTheme } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\n\n\n\n// Better Prop Interface for SDKs\nexport interface ChatWidgetProps {\n title?: string;\n placeholder?: string;\n emptyStateText?: string;\n emptyStateSuggestions?: string;\n defaultCurrency?: string;\n className?: string;\n \n // Allow overriding styles via standard CSS variables\n theme?: AkropolysTheme;\n \n // Allow targeting specific elements with custom classes (e.g. Tailwind)\n classNames?: {\n root?: string;\n header?: string;\n messageBubble?: string;\n input?: string;\n };\n \n onSelectSource?: (source: ChatSource) => void;\n}\n\n// Simple SVG Icons instead of text characters\nconst SparkleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\"/>\n </svg>\n);\n\nconst ArrowUpIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\"/>\n <path d=\"M12 19V5\"/>\n </svg>\n);\n\nfunction SourceCard({ source, defaultCurrency, onSelect }: { source: ChatSource; defaultCurrency: string; onSelect?: (s: ChatSource) => void }) {\n return (\n <div className=\"hsk-source-card\" onClick={() => onSelect?.(source)}>\n {source.image && <img src={source.image} alt={source.name} className=\"hsk-source-img\" />}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div className=\"hsk-source-name\">{source.name}</div>\n {source.price && (\n <div className=\"hsk-source-price\">{source.currency ?? defaultCurrency} {source.price}</div>\n )}\n </div>\n </div>\n );\n}\n\nexport function ChatWidget({ \n title = 'AI Shopping Assistant',\n placeholder = 'Ask about anything in our store…', \n emptyStateText = 'Ask me anything about our products',\n emptyStateSuggestions = '\"Find me headphones under KSh 5,000\" · \"Gift ideas\"',\n defaultCurrency = 'KES',\n className,\n theme,\n classNames = {},\n onSelectSource \n}: ChatWidgetProps) {\n const { messages, sources, loading, error, send, reset } = useKiku();\n const [input, setInput] = useState('');\n const bottomRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, loading]);\n\n const handleSend = async () => {\n const q = input.trim();\n if (!q || loading) return;\n setInput('');\n if (textareaRef.current) textareaRef.current.style.height = 'auto';\n await send(q);\n };\n\n const handleKey = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const handleInput = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n const t = e.target;\n t.style.height = 'auto';\n t.style.height = Math.min(t.scrollHeight, 120) + 'px';\n };\n\n // Apply custom CSS variables inline to the root wrapper\n const customStyles = {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties;\n\n return (\n <div \n className={cn(\"hsk-chat-widget\", classNames.root, className)} \n style={customStyles}\n >\n <div className={cn(\"hsk-chat-header\", classNames.header)}>\n <span className=\"hsk-chat-header-icon\"><SparkleIcon /></span>\n <span className=\"hsk-chat-title\">{title}</span>\n <span className=\"hsk-chat-badge\">AI</span>\n {messages.length > 0 && (\n <button className=\"hsk-chat-reset\" onClick={reset} style={{ marginLeft: 'auto' }}>Clear</button>\n )}\n </div>\n\n <div className=\"hsk-chat-messages\">\n {messages.length === 0 ? (\n <div className=\"hsk-chat-empty\">\n <div className=\"hsk-chat-empty-icon\"><SparkleIcon /></div>\n <div>{emptyStateText}</div>\n <div className=\"hsk-chat-empty-suggestions\">{emptyStateSuggestions}</div>\n </div>\n ) : (\n messages.map((msg, idx) => (\n <div key={idx}>\n <div className={`hsk-msg-row ${msg.role}`}>\n <div className={cn(\"hsk-msg-avatar\", msg.role === 'assistant' ? 'ai' : 'user')}>\n {msg.role === 'assistant' ? <SparkleIcon /> : 'U'}\n </div>\n <div className={cn(\"hsk-msg-bubble\", msg.role, classNames.messageBubble)}>\n {renderMarkdown(msg.content)}\n </div>\n </div>\n {msg.role === 'assistant' && idx === messages.length - 1 && sources.length > 0 && (\n <div className=\"hsk-sources-container\">\n <div className=\"hsk-sources\">\n {sources.map((src, si) => (\n <SourceCard key={si} source={src} defaultCurrency={defaultCurrency} onSelect={onSelectSource} />\n ))}\n </div>\n </div>\n )}\n </div>\n ))\n )}\n\n {loading && (\n <div className=\"hsk-msg-row\">\n <div className=\"hsk-msg-avatar ai\"><SparkleIcon /></div>\n <div className=\"hsk-pending\" role=\"status\" aria-live=\"polite\">\n <div className=\"hsk-pending-glyph\">\n <span className=\"hsk-pending-ring\" />\n <span className=\"hsk-pending-dot\" />\n </div>\n <div className=\"hsk-pending-text\">\n <span className=\"hsk-pending-step step-1\">Searching catalog</span>\n <span className=\"hsk-pending-step step-2\">Reasoning</span>\n <span className=\"hsk-pending-step step-3\">Composing</span>\n </div>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"hsk-chat-error\">\n {(() => {\n try {\n const parsed = JSON.parse(error);\n return parsed.error || parsed.message || error;\n } catch {\n return error;\n }\n })()}\n </div>\n )}\n <div ref={bottomRef} />\n </div>\n\n <div className=\"hsk-chat-input-area\">\n <textarea\n ref={textareaRef}\n className={cn(\"hsk-chat-input\", classNames.input)}\n value={input}\n onChange={handleInput}\n onKeyDown={handleKey}\n placeholder={placeholder}\n rows={1}\n disabled={loading}\n />\n <button\n className=\"hsk-chat-send\"\n onClick={handleSend}\n disabled={!input.trim() || loading}\n aria-label=\"Send message\"\n >\n <ArrowUpIcon />\n </button>\n </div>\n </div>\n );\n}\n\n","import React from 'react';\n\n// Helper to parse inline styles (bold, links, and inline code) safely into React nodes\nconst parseInline = (text: string, keyPrefix: string): React.ReactNode => {\n // Regex to match markdown links, bold text, and inline code\n const tokenRegex = /(\\[[^\\]]+\\]\\([^)]+\\)|\\*\\*[^*]+\\*\\*|`[^`]+`)/g;\n const parts = text.split(tokenRegex);\n\n return parts.map((part, index) => {\n if (!part) return null;\n const key = `${keyPrefix}-inline-${index}`;\n\n // Handle Inline Code\n if (part.startsWith('`') && part.endsWith('`')) {\n return (\n <code key={key} className=\"hsk-markdown-code\">\n {part.slice(1, -1)}\n </code>\n );\n }\n\n // Handle Bold\n if (part.startsWith('**') && part.endsWith('**')) {\n return <strong key={key}>{parseInline(part.slice(2, -2), key)}</strong>;\n }\n\n // Handle Links\n const linkMatch = part.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)$/);\n if (linkMatch) {\n // Basic sanitization: ensure the URL doesn't contain javascript:\n const url = linkMatch[2];\n const isSafeUrl = /^(https?|mailto|tel):/i.test(url) || url.startsWith('/');\n if (isSafeUrl) {\n return (\n <a key={key} href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hsk-markdown-link\">\n {parseInline(linkMatch[1], key)}\n </a>\n );\n }\n return <span key={key}>{parseInline(linkMatch[1], key)}</span>; // Fallback to plain text if unsafe\n }\n\n // Return standard text\n return part;\n });\n};\n\nexport function renderMarkdown(content: string): React.ReactNode {\n const lines = content.split('\\n');\n const elements: React.ReactNode[] = [];\n \n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n const key = `md-line-${i}`;\n\n // 1. Empty lines (spacing)\n if (!line.trim()) {\n i++;\n continue;\n }\n\n // 2. Headers\n const headerMatch = line.match(/^(#{1,3})\\s+(.*)/);\n if (headerMatch) {\n const level = headerMatch[1].length;\n const Tag = `h${level + 3}` as keyof JSX.IntrinsicElements; // Maps # to h4, ## to h5 to avoid messing up host page hierarchy\n elements.push(<Tag key={key} className={`hsk-markdown-h${level}`}>{parseInline(headerMatch[2], key)}</Tag>);\n i++;\n continue;\n }\n\n // 3. Unordered Lists\n if (line.match(/^[-*]\\s+/)) {\n const listItems: React.ReactNode[] = [];\n while (i < lines.length && lines[i].match(/^[-*]\\s+/)) {\n const itemText = lines[i].replace(/^[-*]\\s+/, '');\n listItems.push(<li key={`li-${i}`}>{parseInline(itemText, `li-${i}`)}</li>);\n i++;\n }\n elements.push(<ul key={`ul-${key}`} className=\"hsk-markdown-list\">{listItems}</ul>);\n continue;\n }\n\n // 4. Tables\n if (line.trim().startsWith('|')) {\n const tableRows: React.ReactNode[] = [];\n let isHeader = true;\n\n while (i < lines.length && lines[i].trim().startsWith('|')) {\n const rowLine = lines[i].trim();\n // Skip markdown table separator (e.g., |---|---|)\n if (rowLine.match(/^\\|[-:| ]+\\|$/)) {\n i++;\n isHeader = false;\n continue;\n }\n\n // Slice to remove outer pipes and map trim to handle empty cells properly\n const cells = rowLine.split('|').slice(1, -1).map(c => c.trim());\n const Tag = isHeader ? 'th' : 'td';\n \n tableRows.push(\n <tr key={`tr-${i}`}>\n {cells.map((cell, cIdx) => (\n <Tag key={`td-${i}-${cIdx}`}>{parseInline(cell, `td-${i}-${cIdx}`)}</Tag>\n ))}\n </tr>\n );\n i++;\n }\n \n elements.push(\n <div key={`table-wrapper-${key}`} className=\"hsk-table-wrapper\">\n <table className=\"hsk-markdown-table\">\n <tbody>{tableRows}</tbody>\n </table>\n </div>\n );\n continue;\n }\n\n // 5. Default Paragraph\n elements.push(\n <p key={key} className=\"hsk-markdown-p\">\n {parseInline(line, key)}\n </p>\n );\n i++;\n }\n\n return <>{elements}</>;\n}\n","'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useKiku, ChatMessage, ChatSource } from '@akropolys/sdk';\nimport { usePaymentPolling } from '@akropolys/sdk';\nimport { useAkropolysContext } from '@akropolys/sdk';\nimport { renderMarkdown } from '../utils/markdown';\nimport { AkropolysTheme, CartPayload, CartItem } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\nimport { ComparisonMatrix } from './ComparisonMatrix';\n\n\nexport interface KikuButtonProps {\n label?: string;\n title?: string;\n placeholder?: string;\n backdropColor?: string;\n backdropBlur?: string | number;\n className?: string;\n onSelectSource?: (source: ChatSource) => void;\n defaultCurrency?: string;\n chips?: string[];\n theme?: 'light' | 'dark' | AkropolysTheme;\n classNames?: {\n button?: string;\n overlay?: string;\n panel?: string;\n input?: string;\n sendButton?: string;\n };\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\n/**\n * Akropolys brand mark — an ancient serif capital Alpha (Α)\n * with an animated smooth breathing mark (spiritus lenis ʻ) at top-left.\n * The mark pulses gently, like a breath.\n */\nconst AkropolysAIcon = ({ className, size = 18 }: { className?: string; size?: number }) => (\n <svg\n className={cn(\"hsk-brand-a\", className)}\n width={size}\n height={size}\n viewBox=\"0 0 28 30\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-label=\"Akropolys\"\n >\n {/* Left leg: elegant thin stroke */}\n <path\n d=\"M14.5 4.5 L6.5 25\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n />\n {/* Right leg: bold ancient serif thick stroke */}\n <path\n d=\"M14.5 4.5 L22.5 25\"\n stroke=\"currentColor\"\n strokeWidth=\"4.2\"\n strokeLinecap=\"round\"\n />\n {/* Crossbar */}\n <path\n d=\"M9.5 17 H19.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n {/* Left base serif */}\n <path\n d=\"M3 25 H10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n {/* Right base serif */}\n <path\n d=\"M19 25 H26\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n {/* Smooth breathing mark (spiritus lenis) at top-left — animated */}\n <path\n d=\"M8.5 2.5 C10 2.5, 11 3.5, 11 5 C11 7, 8.5 8.5, 7.5 9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n className=\"hsk-akr-breath\"\n />\n </svg>\n);\n\n/** Keep a tiny sparkle alias for places that still want the star (sources, etc.) */\nconst SparkleIcon = AkropolysAIcon;\n\nconst ArrowUpIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\"/>\n <path d=\"M12 19V5\"/>\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n);\n\nconst ChevronRightIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\"/>\n </svg>\n);\n\nconst HistoryIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"/>\n <path d=\"M3 3v5h5\"/>\n <path d=\"M12 7v5l4 2\"/>\n </svg>\n);\n\nconst NewChatIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M5 12h14\"/>\n </svg>\n);\n\nconst ShoppingBagIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 2 3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"/>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/>\n <path d=\"M16 10a4 4 0 0 1-8 0\"/>\n </svg>\n);\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst DEFAULT_CHIPS = [\n 'Cheapest smartphone',\n 'Smart TV under KSh 20,000',\n 'Noise-cancelling headphones',\n 'Best laptop for students',\n];\n\nconst SESSIONS_KEY = 'akropolys_chat_sessions';\nconst MAX_SESSIONS = 20;\n\n// ─── Session types ─────────────────────────────────────────────────────────────\n\ninterface ChatSession {\n id: string;\n title: string;\n messages: ChatMessage[];\n ts: number;\n}\n\nfunction loadSessions(): ChatSession[] {\n try {\n if (typeof window === 'undefined') return [];\n const raw = localStorage.getItem(SESSIONS_KEY);\n return raw ? JSON.parse(raw) : [];\n } catch {\n return [];\n }\n}\n\nfunction saveSessions(sessions: ChatSession[]) {\n try {\n if (typeof window === 'undefined') return;\n localStorage.setItem(SESSIONS_KEY, JSON.stringify(sessions.slice(0, MAX_SESSIONS)));\n } catch {}\n}\n\nfunction relativeTime(ts: number): string {\n const diff = Date.now() - ts;\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n return `${days}d ago`;\n}\n\n// ─── Cart Context Card ─────────────────────────────────────────────────────────\n\ninterface CartContextCardProps {\n cart: CartPayload;\n defaultCurrency: string;\n}\n\nfunction CartContextCard({ cart, defaultCurrency }: CartContextCardProps) {\n if (!cart.items || cart.items.length === 0) return null;\n\n const currency = cart.currency || defaultCurrency;\n const total = cart.total ?? cart.items.reduce((s: number, i: CartItem) => s + i.price_numeric * i.quantity, 0);\n\n return (\n <div className=\"hsk-cart-card\">\n <div className=\"hsk-cart-card-header\">\n <ShoppingBagIcon />\n <span>Your cart · {cart.item_count ?? cart.items.length} item{(cart.item_count ?? cart.items.length) !== 1 ? 's' : ''}</span>\n </div>\n <div className=\"hsk-cart-items\">\n {cart.items.map((item: CartItem) => (\n\n <div key={item.id} className=\"hsk-cart-item\">\n <div className=\"hsk-cart-item-img-wrap\">\n {item.image ? (\n <img className=\"hsk-cart-item-img\" src={item.image} alt={item.name} loading=\"lazy\" />\n ) : (\n <div className=\"hsk-cart-item-img-placeholder\">\n <ShoppingBagIcon />\n </div>\n )}\n {item.quantity > 1 && (\n <span className=\"hsk-cart-item-qty\">{item.quantity}</span>\n )}\n </div>\n <div className=\"hsk-cart-item-info\">\n <div className=\"hsk-cart-item-name\">{item.name}</div>\n <div className=\"hsk-cart-item-price\">\n {item.quantity > 1 && <span className=\"hsk-cart-item-qty-label\">{item.quantity}× </span>}\n {currency} {(item.price_numeric * item.quantity).toLocaleString()}\n </div>\n </div>\n </div>\n ))}\n </div>\n <div className=\"hsk-cart-total\">\n <span>Total</span>\n <span className=\"hsk-cart-total-amount\">{currency} {total.toLocaleString()}</span>\n </div>\n </div>\n );\n}\n\n// ─── Action Pills ──────────────────────────────────────────────────────────────\n\ninterface ActionPillsProps {\n cart: CartPayload;\n actionType?: string;\n onSend: (text: string) => void;\n loading: boolean;\n}\n\nfunction ActionPills({ cart, actionType, onSend, loading }: ActionPillsProps) {\n const hasItems = cart.items && cart.items.length > 0;\n const lastItem = hasItems ? cart.items[cart.items.length - 1] : null;\n\n const pills: { label: string; query: string; emoji: string }[] = [];\n\n if (hasItems && lastItem) {\n if (actionType === 'add_to_cart') {\n pills.push({ emoji: '➕', label: 'Add 1 more', query: `Add one more ${lastItem.name} to my cart` });\n pills.push({ emoji: '🗑️', label: `Remove ${lastItem.name.split(' ')[0]}`, query: `Remove the ${lastItem.name} from my cart` });\n }\n if (cart.items.length > 1) {\n pills.push({ emoji: '🛒', label: 'View cart', query: 'Show me my cart' });\n }\n pills.push({ emoji: '💳', label: 'Checkout', query: 'Proceed to checkout' });\n pills.push({ emoji: '🛍️', label: 'Keep shopping', query: 'What else do you recommend?' });\n } else if (actionType === 'clear_cart' || actionType === 'remove_from_cart') {\n pills.push({ emoji: '🛍️', label: 'Continue shopping', query: 'Show me popular products' });\n pills.push({ emoji: '🔍', label: 'Search again', query: 'Help me find something' });\n } else if (actionType === 'view_cart') {\n if (hasItems) {\n pills.push({ emoji: '💳', label: 'Checkout', query: 'Proceed to checkout' });\n pills.push({ emoji: '🗑️', label: 'Clear cart', query: 'Clear my cart' });\n }\n }\n\n if (pills.length === 0) return null;\n\n return (\n <div className=\"hsk-action-pills\">\n {pills.map((pill) => (\n <button\n key={pill.query}\n className=\"hsk-action-pill\"\n onClick={() => onSend(pill.query)}\n disabled={loading}\n >\n <span className=\"hsk-pill-emoji\">{pill.emoji}</span>\n {pill.label}\n </button>\n ))}\n </div>\n );\n}\n\n// ─── Sources Carousel ──────────────────────────────────────────────────────────\n\ninterface SourcesCarouselProps {\n sources: ChatSource[];\n defaultCurrency: string;\n onSelectSource?: (src: ChatSource) => void;\n}\n\nfunction SourcesCarousel({ sources, defaultCurrency, onSelectSource }: SourcesCarouselProps) {\n const client = useAkropolysContext();\n const isProperty = client?.vertical === 'property';\n const railRef = useRef<HTMLDivElement>(null);\n const [showNext, setShowNext] = useState(false);\n\n const measure = useCallback(() => {\n const el = railRef.current;\n if (!el) return;\n const atEnd = el.scrollLeft + el.clientWidth >= el.scrollWidth - 8;\n setShowNext(el.scrollWidth > el.clientWidth + 4 && !atEnd);\n }, []);\n\n useEffect(() => {\n measure();\n const el = railRef.current;\n if (!el) return;\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n el.addEventListener('scroll', measure, { passive: true });\n return () => { ro.disconnect(); el.removeEventListener('scroll', measure); };\n }, [measure, sources]);\n\n const scrollNext = () => {\n railRef.current?.scrollBy({ left: 170, behavior: 'smooth' });\n };\n\n return (\n <div className=\"hsk-cb-sources-wrap\">\n <div className=\"hsk-cb-sources\" ref={railRef}>\n {sources.map((src, si) => (\n <div\n key={si}\n className=\"hsk-cb-source\"\n style={{ animationDelay: `${si * 50}ms` }}\n onClick={() => onSelectSource?.(src)}\n >\n {src.image ? (\n <div className=\"hsk-cb-src-imgwrap\" style={{ position: 'relative' }}>\n <img src={src.image} alt={src.name} loading=\"lazy\" />\n {isProperty && (\n <div style={{\n position: 'absolute',\n top: '6px',\n right: '6px',\n background: 'rgba(14, 14, 15, 0.75)',\n backdropFilter: 'blur(4px)',\n borderRadius: '50%',\n width: '24px',\n height: '24px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#fbbf24', // Gold sparkle badge\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)'\n }}>\n <SparkleIcon size={12} />\n </div>\n )}\n </div>\n ) : (\n <div className=\"hsk-cb-src-imgwrap-empty\">\n <SparkleIcon />\n </div>\n )}\n <div className=\"hsk-cb-src-info\">\n <div className=\"hsk-cb-src-name\">{src.name}</div>\n {src.price && (\n <div className=\"hsk-cb-src-price\">\n {src.currency ?? defaultCurrency}{' '}\n {parseFloat(String(src.price).replace(/[^0-9.]/g, '') || '0').toLocaleString()}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n {showNext && (\n <>\n <div\n className=\"hsk-cb-sources-fade\"\n style={{ background: 'linear-gradient(to right, transparent, var(--hsk-fade-bg, #0e0e0f))' }}\n />\n <button className=\"hsk-cb-sources-next\" onClick={scrollNext} aria-label=\"See more\">\n <ChevronRightIcon />\n </button>\n </>\n )}\n </div>\n );\n}\n\n// ─── Strip markdown tables (used for compare view to avoid duplicate) ──────────\n\nfunction stripMarkdownTables(content: string): string {\n const lines = content.split('\\n');\n const out: string[] = [];\n for (const line of lines) {\n if (line.trim().startsWith('|')) continue; // table row or separator\n out.push(line);\n }\n // Collapse runs of 3+ blank lines down to 2\n return out.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim();\n}\n\n// ─── Smart context pills ──────────────────────────────────────────────────────\n// Shown after every assistant response (when there's no cart action).\n// Pills are generated from the current intent + sources so they're always relevant.\n\nfunction SmartContextPills({\n intent,\n sources,\n onSend,\n loading,\n}: {\n intent: string | null;\n sources: ChatSource[];\n onSend: (text: string) => void;\n loading: boolean;\n}) {\n const client = useAkropolysContext();\n const isProperty = client?.vertical === 'property';\n if (!intent) return null;\n\n const pills: { label: string; query: string; emoji: string }[] = [];\n\n // Find the cheapest product in the sources list\n const cheapest =\n sources.length > 0\n ? sources.reduce((min, s) => {\n const p = parseFloat(String(s.price ?? '').replace(/[^0-9.]/g, ''));\n const m = parseFloat(String(min.price ?? '').replace(/[^0-9.]/g, ''));\n return !isNaN(p) && (isNaN(m) || p < m) ? s : min;\n }, sources[0])\n : null;\n\n const firstName = sources[0]?.name ?? '';\n const firstTwo = sources.slice(0, 2).map(s => s.name);\n\n if (intent === 'search' && sources.length > 0) {\n if (firstTwo.length >= 2) {\n pills.push({\n emoji: '⚖️',\n label: 'Compare top 2',\n query: `Compare the ${firstTwo[0]} and ${firstTwo[1]}`,\n });\n }\n if (cheapest && !isProperty) {\n const short = cheapest.name.split(' ').slice(0, 3).join(' ');\n pills.push({\n emoji: '🛒',\n label: `Add ${short}`,\n query: `Add the ${cheapest.name} to my cart`,\n });\n }\n if (isProperty) {\n pills.push({ emoji: '💰', label: 'Under KSh 5M', query: 'Show me options under KSh 5,000,000' });\n } else {\n pills.push({ emoji: '💰', label: 'Under KSh 20K', query: 'Show me options under KSh 20,000' });\n }\n } else if (intent === 'compare' && sources.length > 0) {\n if (cheapest && !isProperty) {\n const short = cheapest.name.split(' ').slice(0, 3).join(' ');\n pills.push({\n emoji: '🛒',\n label: `Add ${short}`,\n query: `Add the ${cheapest.name} to my cart`,\n });\n }\n if (firstName) {\n pills.push({\n emoji: '🔍',\n label: 'Similar options',\n query: isProperty\n ? `Show me more properties similar to the ${firstName}`\n : `Show me more products similar to the ${firstName}`,\n });\n }\n pills.push({ emoji: '💡', label: 'Which is best?', query: 'Which one would you recommend and why?' });\n } else if (intent === 'specs' && sources.length > 0) {\n if (firstName) {\n if (!isProperty) {\n pills.push({ emoji: '🛒', label: 'Add to cart', query: `Add the ${firstName} to my cart` });\n }\n pills.push({\n emoji: '🔄',\n label: 'Find alternatives',\n query: `What are good alternatives to the ${firstName}?`,\n });\n }\n } else if (intent === 'general') {\n if (isProperty) {\n pills.push({ emoji: '🔍', label: 'Show popular listings', query: 'What are your most popular properties?' });\n } else {\n pills.push({ emoji: '🔍', label: 'Show popular items', query: 'What are your most popular products?' });\n }\n pills.push({ emoji: '💡', label: 'Recommend something', query: 'What do you recommend for me?' });\n }\n\n if (pills.length === 0) return null;\n\n return (\n <div className=\"hsk-action-pills\">\n {pills.map(pill => (\n <button\n key={pill.query}\n className=\"hsk-action-pill\"\n onClick={() => onSend(pill.query)}\n disabled={loading}\n >\n <span className=\"hsk-pill-emoji\">{pill.emoji}</span>\n {pill.label}\n </button>\n ))}\n </div>\n );\n}\n\n// ─── Error helper ──────────────────────────────────────────────────────────────\n\nconst getFriendlyError = (err: any) => {\n let str = '';\n if (typeof err === 'string') str = err;\n else if (err && typeof err === 'object' && err.message) str = err.message;\n else try { str = JSON.stringify(err); } catch { str = String(err); }\n\n const lower = str.toLowerCase();\n if (\n lower.includes('429') ||\n lower.includes('too many requests') ||\n lower.includes('requests per minute limit exceeded') ||\n lower.includes('too_many_requests_error') ||\n lower.includes('request_quota_exceeded') ||\n lower.includes('quota')\n ) {\n return 'The assistant is currently receiving too many requests. Please try again in a few moments.';\n }\n\n if (lower.includes('token limit')) {\n return \"You've reached your usage limit. Please update your billing limits in your dashboard to continue.\";\n }\n\n try {\n const parsed = JSON.parse(str);\n return parsed.error || parsed.message || str;\n } catch {\n return str;\n }\n};\n\n// ─── ChatModal Props ───────────────────────────────────────────────────────────\n\ninterface ChatModalProps extends Pick<KikuButtonProps, 'title' | 'placeholder' | 'backdropColor' | 'backdropBlur' | 'onSelectSource' | 'defaultCurrency' | 'chips' | 'theme' | 'classNames'> {\n theme?: 'light' | 'dark' | AkropolysTheme;\n classNames?: any;\n onClose: () => void;\n}\n\n// ─── ChatModal ─────────────────────────────────────────────────────────────────\n\nconst LOADING_MESSAGES = [\n \"Walking down the aisle...\",\n \"Consulting the blueprints...\",\n \"Polishing the keys...\",\n \"Checking the backyard...\",\n \"Checking the inventory...\",\n \"Inspecting the plumbing...\",\n \"Asking the concierge...\",\n \"Searching the shelves...\",\n \"Measuring the square footage...\",\n \"Dusting off the fireplace...\",\n \"Asking the store clerk...\"\n];\n\nconst PROPERTY_CHIPS = [\n '3 bedroom apartments',\n 'Houses under KSh 5,000,000',\n 'Properties in Palm Beach',\n 'Studio apartments with pool',\n];\n\nfunction ChatModal({\n title = 'Shopping Assistant',\n placeholder = 'Ask me anything — gifts, budget, use case…',\n backdropColor,\n backdropBlur,\n onClose,\n onSelectSource,\n defaultCurrency = 'KES',\n chips = DEFAULT_CHIPS,\n theme,\n classNames = {},\n}: ChatModalProps) {\n const client = useAkropolysContext();\n const { messages, sources, loading, streaming, error, lastAction, lastIntent, send, reset } = useKiku();\n const [input, setInput] = useState('');\n const [loadingMessageIndex, setLoadingMessageIndex] = useState(0);\n\n const isProperty = client.vertical === 'property';\n const activeChips = chips === DEFAULT_CHIPS && isProperty ? PROPERTY_CHIPS : chips;\n const activeTitle = title === 'Shopping Assistant' && isProperty ? 'Property Assistant' : title;\n const activePlaceholder = placeholder === 'Ask me anything — gifts, budget, use case…' && isProperty\n ? 'Ask me anything — location, budget, bedrooms…'\n : placeholder;\n\n useEffect(() => {\n if (loading && !streaming) {\n const interval = setInterval(() => {\n setLoadingMessageIndex((prev) => (prev + 1) % LOADING_MESSAGES.length);\n }, 1500);\n return () => clearInterval(interval);\n } else {\n setLoadingMessageIndex(0);\n }\n }, [loading, streaming]);\n const [selectedProduct, setSelectedProduct] = useState<ChatSource | null>(null);\n const bottomRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [phoneInput, setPhoneInput] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_phone') || '';\n }\n return '';\n });\n const [merchantRef, setMerchantRef] = useState<string | null>(null);\n const [paymentPhase, setPaymentPhase] = useState<'idle' | 'prompt_phone' | 'awaiting' | 'done' | 'failed'>('idle');\n\n // ── History sidebar ──────────────────────────────────────────────────────────\n const [sessions, setSessions] = useState<ChatSession[]>(() => loadSessions());\n const [sidebarOpen, setSidebarOpen] = useState(false);\n const [replayMessages, setReplayMessages] = useState<ChatMessage[] | null>(null); // null = live session\n\n // ── Payment polling ──────────────────────────────────────────────────────────\n const { status: pollStatus } = usePaymentPolling({\n client: client.api,\n merchantReference: merchantRef,\n onSuccess: () => {\n setPaymentPhase('done');\n setMerchantRef(null);\n },\n onFailure: () => {\n setPaymentPhase('failed');\n setMerchantRef(null);\n },\n });\n\n // React to lastAction from chat\n useEffect(() => {\n if (!lastAction) return;\n if (lastAction.type === 'request_phone') {\n setPaymentPhase('prompt_phone');\n } else if (lastAction.type === 'awaiting_payment') {\n setMerchantRef(lastAction.merchantReference ?? null);\n setPaymentPhase('awaiting');\n }\n }, [lastAction]);\n\n const isStringTheme = typeof theme === 'string';\n const hskThemeAttr = isStringTheme ? theme : undefined;\n\n const customStyles = (!isStringTheme && theme) ? {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties : undefined;\n\n const handlePhoneSubmit = async () => {\n if (!phoneInput.trim()) return;\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem('akropolys_user_phone', phoneInput.trim());\n }\n const res = await client.api.initiatePayment(phoneInput.trim());\n setMerchantRef(res.merchantReference);\n setPaymentPhase('awaiting');\n } catch (e: any) {\n console.error('[Akropolys] initiatePayment error', e);\n setPaymentPhase('failed');\n }\n };\n\n // Auto-scroll: only when the user is already pinned near the bottom (within 120px).\n // This lets them freely scroll up to re-read earlier messages while streaming continues.\n const msgsContainerRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const container = msgsContainerRef.current;\n if (!container) return;\n const distanceFromBottom = container.scrollHeight - container.scrollTop - container.clientHeight;\n if (distanceFromBottom < 120) {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n }\n }, [messages, loading, selectedProduct]);\n\n useEffect(() => {\n const h = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', h);\n return () => document.removeEventListener('keydown', h);\n }, []);\n\n // ── Save session on reset or close ───────────────────────────────────────────\n const saveCurrentSession = useCallback(() => {\n if (messages.length < 2) return; // Nothing worth saving\n const firstUser = messages.find(m => m.role === 'user');\n const session: ChatSession = {\n id: `session_${Date.now()}`,\n title: firstUser ? firstUser.content.slice(0, 60) : 'Chat session',\n messages: messages,\n ts: Date.now(),\n };\n const updated = [session, ...sessions].slice(0, MAX_SESSIONS);\n setSessions(updated);\n saveSessions(updated);\n }, [messages, sessions]);\n\n const handleReset = useCallback(() => {\n saveCurrentSession();\n reset();\n setReplayMessages(null);\n setPaymentPhase('idle');\n setMerchantRef(null);\n }, [reset, saveCurrentSession]);\n\n const handleSourceClick = (src: ChatSource) => {\n setSelectedProduct(src);\n onSelectSource?.(src);\n const q = `Tell me more about the ${src.name}${src.price ? ` (${src.currency ?? defaultCurrency} ${src.price})` : ''} — what are its key specs, who is it best for, and is it worth buying?`;\n send(q);\n };\n\n const handleSend = async (text?: string) => {\n const q = (text ?? input).trim();\n if (!q || loading) return;\n // If we're in replay mode, exit replay and continue live\n setReplayMessages(null);\n setSelectedProduct(null);\n setInput('');\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n await send(q);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); }\n };\n\n const handleInput = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n const t = e.target;\n t.style.height = 'auto';\n t.style.height = `${Math.min(t.scrollHeight, 140)}px`;\n };\n\n const blurVal = typeof backdropBlur === 'number' ? `${backdropBlur}px` : (backdropBlur ?? '20px');\n\n // The messages to display: replay or live\n const displayMessages = replayMessages ?? messages;\n\n // ── Load a historical session ─────────────────────────────────────────────────\n const loadSession = (session: ChatSession) => {\n setReplayMessages(session.messages);\n setSidebarOpen(false);\n };\n\n // ── Delete a session ──────────────────────────────────────────────────────────\n const deleteSession = (id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const updated = sessions.filter(s => s.id !== id);\n setSessions(updated);\n saveSessions(updated);\n };\n\n return (\n <div\n className={cn(\"hsk-cb-overlay\", classNames.overlay)}\n onClick={onClose}\n data-hsk-theme={hskThemeAttr}\n style={{\n backdropFilter: `blur(${blurVal})`,\n WebkitBackdropFilter: `blur(${blurVal})`,\n ...(backdropColor ? { background: backdropColor } : {}),\n ...customStyles,\n }}\n >\n <div className={cn(\"hsk-cb-panel hsk-cb-panel--with-sidebar\", classNames.panel)} onClick={e => e.stopPropagation()}>\n\n {/* ── History Sidebar ── */}\n <div className={cn(\"hsk-cb-sidebar\", sidebarOpen && \"hsk-cb-sidebar--open\")}>\n <div className=\"hsk-cb-sidebar-header\">\n <span className=\"hsk-cb-sidebar-title\">History</span>\n <button\n className=\"hsk-cb-sidebar-new\"\n onClick={handleReset}\n title=\"New chat\"\n >\n <NewChatIcon />\n <span>New chat</span>\n </button>\n </div>\n <div className=\"hsk-cb-sidebar-list\">\n {sessions.length === 0 ? (\n <div className=\"hsk-cb-sidebar-empty\">\n <HistoryIcon />\n <span>No history yet</span>\n </div>\n ) : (\n sessions.map(session => (\n <div\n key={session.id}\n className={cn(\n \"hsk-cb-sidebar-session\",\n replayMessages === session.messages && \"hsk-cb-sidebar-session--active\"\n )}\n onClick={() => loadSession(session)}\n >\n <div className=\"hsk-cb-sidebar-session-title\">{session.title}</div>\n <div className=\"hsk-cb-sidebar-session-meta\">{relativeTime(session.ts)}</div>\n <button\n className=\"hsk-cb-sidebar-session-del\"\n onClick={(e) => deleteSession(session.id, e)}\n title=\"Delete\"\n >\n ×\n </button>\n </div>\n ))\n )}\n </div>\n </div>\n\n {/* ── Main Chat Area ── */}\n <div className=\"hsk-cb-main\">\n\n {/* Top bar */}\n <div className=\"hsk-cb-topbar\">\n <div className=\"hsk-cb-topbar-left\">\n {/* Sidebar toggle (always visible) */}\n <button\n className={cn(\"hsk-cb-sidebar-toggle\", sidebarOpen && \"hsk-cb-sidebar-toggle--active\")}\n onClick={(e) => { e.stopPropagation(); setSidebarOpen(v => !v); }}\n aria-label=\"Toggle history\"\n >\n <HistoryIcon />\n </button>\n <span className=\"hsk-cb-topbar-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </span>\n <div>\n <div className=\"hsk-cb-topbar-title\">{activeTitle}</div>\n </div>\n </div>\n <div className=\"hsk-cb-topbar-actions\">\n {replayMessages ? (\n <button className=\"hsk-cb-topbar-btn\" onClick={() => { setReplayMessages(null); }}>← Live chat</button>\n ) : (\n messages.length > 0 && (\n <button className=\"hsk-cb-topbar-btn\" onClick={handleReset}>Clear chat</button>\n )\n )}\n <button className=\"hsk-cb-close\" onClick={onClose} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n </div>\n\n {/* Replay banner */}\n {replayMessages && (\n <div className=\"hsk-cb-replay-banner\">\n <HistoryIcon />\n <span>You're viewing a past conversation.</span>\n <button onClick={() => setReplayMessages(null)}>Back to chat →</button>\n </div>\n )}\n\n {/* Messages */}\n <div className=\"hsk-cb-msgs\" ref={msgsContainerRef}>\n {displayMessages.length === 0 ? (\n <div className=\"hsk-cb-empty\">\n <div className=\"hsk-cb-empty-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </div>\n <div className=\"hsk-cb-empty-title\">Find exactly what you need</div>\n <div className=\"hsk-cb-chips\">\n {activeChips.map(chip => (\n <button\n key={chip}\n className=\"hsk-cb-chip\"\n onClick={() => handleSend(chip)}\n >\n {chip}\n </button>\n ))}\n </div>\n </div>\n ) : (\n displayMessages.map((msg: ChatMessage, idx: number) => {\n const isLast = idx === displayMessages.length - 1 && !replayMessages;\n const isUser = msg.role === 'user';\n // Strip the LLM's markdown table for compare so ComparisonMatrix isn't duplicated\n const displayContent =\n !isUser && isLast && lastIntent === 'compare' && sources.length >= 2 && !replayMessages\n ? stripMarkdownTables(msg.content)\n : msg.content;\n return (\n <div key={idx} className=\"hsk-cb-msg-group\">\n {isUser ? (\n <div className=\"hsk-cb-user-msg\">\n <div className=\"hsk-cb-user-bubble\">{msg.content}</div>\n </div>\n ) : (\n <div className=\"hsk-cb-ai-msg\">\n <div className=\"hsk-cb-ai-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </div>\n <div className=\"hsk-cb-ai-body\">\n <div className=\"hsk-cb-ai-text\">{renderMarkdown(displayContent)}</div>\n\n {/* Comparison matrix — replaces the markdown table when comparing products */}\n {isLast && lastIntent === 'compare' && sources.length >= 2 && !replayMessages && (\n <ComparisonMatrix sources={sources} defaultCurrency={defaultCurrency} />\n )}\n\n {/* Sources carousel — only after latest assistant reply, non-cart, non-compare */}\n {isLast && sources.length > 0 && lastIntent !== 'compare' && lastAction?.type !== 'request_phone' && lastAction?.type !== 'awaiting_payment' && lastAction?.type !== 'checkout' && !msg.cartSnapshot && (\n <SourcesCarousel\n sources={sources}\n defaultCurrency={defaultCurrency}\n onSelectSource={handleSourceClick}\n />\n )}\n\n {/* Cart context card — shown when the message has a cart snapshot */}\n {msg.cartSnapshot && msg.cartSnapshot.items?.length > 0 && (\n <CartContextCard\n cart={msg.cartSnapshot}\n defaultCurrency={defaultCurrency}\n />\n )}\n\n {/* Action pills — for cart-mutating responses */}\n {isLast && msg.cartSnapshot && !loading && (\n <ActionPills\n cart={msg.cartSnapshot}\n actionType={msg.actionType}\n onSend={handleSend}\n loading={loading}\n />\n )}\n\n {/* Smart context pills — for all other intents */}\n {isLast && !loading && !msg.cartSnapshot && !replayMessages && (\n <SmartContextPills\n intent={lastIntent}\n sources={sources}\n onSend={handleSend}\n loading={loading}\n />\n )}\n </div>\n </div>\n )}\n </div>\n );\n })\n )}\n\n {/* Selected product pinned card — shows while LLM fetches details */}\n {selectedProduct && loading && (\n <div\n className=\"hsk-cb-selected-product\"\n onClick={() => selectedProduct.url && window.open(selectedProduct.url, '_blank')}\n >\n {selectedProduct.image && (\n <img className=\"hsk-cb-selected-img\" src={selectedProduct.image} alt={selectedProduct.name} />\n )}\n <div className=\"hsk-cb-selected-info\">\n <div className=\"hsk-cb-selected-name\">{selectedProduct.name}</div>\n {selectedProduct.price && (\n <div className=\"hsk-cb-selected-price\">\n {selectedProduct.currency ?? defaultCurrency} {parseFloat(String(selectedProduct.price ?? '').replace(/[^0-9.]/g, '') || '0').toLocaleString()}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Typing dots — shown ONLY while waiting for the server (loading).\n Once the response arrives and token streaming begins (!loading && streaming)\n the text animates in directly with no dots visible. */}\n {loading && !streaming && (\n <div className=\"hsk-cb-typing-row\" style={{ display: 'flex', alignItems: 'flex-start', gap: '10px' }}>\n <div className=\"hsk-cb-ai-icon\" style={{ display: 'flex', alignItems: 'center', marginTop: '4px' }}>\n <SparkleIcon />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>\n <style>{`\n @keyframes hsk-pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n }\n `}</style>\n <div style={{ fontSize: '0.85rem', color: '#6b7280', fontStyle: 'italic', animation: 'hsk-pulse 1.5s infinite ease-in-out' }}>\n {LOADING_MESSAGES[loadingMessageIndex]}\n </div>\n <div className=\"hsk-cb-typing\" style={{ margin: 0, alignSelf: 'flex-start' }}>\n <div className=\"hsk-cb-dot\" />\n <div className=\"hsk-cb-dot\" />\n <div className=\"hsk-cb-dot\" />\n </div>\n </div>\n </div>\n )}\n\n {error && <div className=\"hsk-cb-error\">{getFriendlyError(error)}</div>}\n\n {/* Payment phase UIs */}\n {!replayMessages && paymentPhase === 'prompt_phone' && (\n <div className=\"hsk-cb-payment-prompt\">\n <div className=\"hsk-cb-payment-icon\">📱</div>\n <p className=\"hsk-cb-payment-label\">Enter your M-Pesa number to pay</p>\n <input\n type=\"tel\"\n className=\"hsk-cb-phone-input\"\n placeholder=\"e.g. 0712 345 678\"\n value={phoneInput}\n onChange={e => setPhoneInput(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handlePhoneSubmit()}\n />\n <button className=\"hsk-cb-pay-submit\" onClick={handlePhoneSubmit}>\n Send STK Push →\n </button>\n </div>\n )}\n\n {!replayMessages && paymentPhase === 'awaiting' && (\n <div className=\"hsk-cb-payment-prompt hsk-cb-payment-prompt--awaiting\">\n <div className=\"hsk-cb-payment-pulse-ring\" />\n <div className=\"hsk-cb-payment-icon-wrap\">\n <span style={{fontSize: '2rem'}}>📱</span>\n </div>\n <p className=\"hsk-cb-payment-label\" style={{fontWeight: 600}}>Check your phone</p>\n <p className=\"hsk-cb-payment-sub\">An M-Pesa STK push has been sent.<br/>Enter your PIN to complete payment.</p>\n <div className=\"hsk-cb-payment-dots\">\n <div className=\"hsk-cb-dot hsk-cb-dot--amber\" />\n <div className=\"hsk-cb-dot hsk-cb-dot--amber\" />\n <div className=\"hsk-cb-dot hsk-cb-dot--amber\" />\n </div>\n </div>\n )}\n\n {!replayMessages && paymentPhase === 'done' && (\n <div className=\"hsk-cb-payment-prompt hsk-cb-payment-prompt--success\">\n <div className=\"hsk-cb-payment-success-ring\" />\n <div className=\"hsk-cb-payment-icon-wrap\">\n <span style={{fontSize: '2.5rem'}}>✅</span>\n </div>\n <p className=\"hsk-cb-payment-label\">Payment complete!</p>\n <p className=\"hsk-cb-payment-sub\">Thank you for your order. A confirmation has been sent.</p>\n </div>\n )}\n\n {!replayMessages && paymentPhase === 'failed' && (\n <div className=\"hsk-cb-payment-prompt hsk-cb-payment-prompt--failed\">\n <div className=\"hsk-cb-payment-icon-wrap\">\n <span style={{fontSize: '2.5rem'}}>❌</span>\n </div>\n <p className=\"hsk-cb-payment-label\">Payment failed or timed out</p>\n <p className=\"hsk-cb-payment-sub\">Please check your M-Pesa PIN and try again, or contact support.</p>\n <div className=\"hsk-cb-payment-actions\">\n <button\n className=\"hsk-cb-pay-submit\"\n onClick={() => { setPaymentPhase('prompt_phone'); setMerchantRef(null); }}\n >\n Try again\n </button>\n <button\n className=\"hsk-cb-pay-secondary\"\n onClick={() => { setPaymentPhase('idle'); setMerchantRef(null); }}\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n <div ref={bottomRef} style={{ height: 1 }} />\n </div>\n\n {/* Input — disabled in replay mode */}\n {!replayMessages && (\n <div className=\"hsk-cb-input-wrap\">\n <div className=\"hsk-cb-input-box\">\n <textarea\n ref={textareaRef}\n className={cn(\"hsk-cb-textarea\", classNames.input)}\n value={input}\n onChange={handleInput}\n onKeyDown={handleKeyDown}\n placeholder={activePlaceholder}\n rows={1}\n disabled={loading}\n autoFocus\n />\n <button\n className={cn(\"hsk-cb-send\", classNames.sendButton)}\n onClick={() => handleSend()}\n disabled={!input.trim() || loading}\n aria-label=\"Send message\"\n >\n <ArrowUpIcon />\n </button>\n </div>\n <div className=\"hsk-cb-hint\">Akropolys AI · searches the whole catalogue in real time</div>\n </div>\n )}\n\n </div>{/* end .hsk-cb-main */}\n\n </div>\n </div>\n );\n}\n\n// ─── KikuButton (public export) ─────────────────────────────────────────────\n\nexport function KikuButton({\n label,\n title,\n placeholder,\n backdropColor,\n backdropBlur,\n className,\n onSelectSource,\n defaultCurrency,\n chips,\n theme,\n classNames = {},\n}: KikuButtonProps) {\n const [open, setOpen] = useState(false);\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n\n if (typeof window !== 'undefined' && !(window as any).__akropolys_nav_patched) {\n (window as any).__akropolys_nav_patched = true;\n const originalPush = window.history.pushState;\n const originalReplace = window.history.replaceState;\n\n window.history.pushState = function(...args) {\n originalPush.apply(this, args);\n window.dispatchEvent(new CustomEvent('akropolys:navigation'));\n };\n\n window.history.replaceState = function(...args) {\n originalReplace.apply(this, args);\n window.dispatchEvent(new CustomEvent('akropolys:navigation'));\n };\n }\n\n const handleNavigation = () => {\n setOpen(false);\n };\n\n window.addEventListener('popstate', handleNavigation);\n window.addEventListener('akropolys:navigation', handleNavigation);\n\n return () => {\n window.removeEventListener('popstate', handleNavigation);\n window.removeEventListener('akropolys:navigation', handleNavigation);\n };\n }, []);\n\n const isStringTheme = typeof theme === 'string';\n const hskThemeAttr = isStringTheme ? theme : undefined;\n\n const customStyles = (!isStringTheme && theme) ? {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties : undefined;\n\n return (\n <>\n <button\n className={cn(\"hsk-cb-btn\", classNames.button, className)}\n onClick={() => setOpen(true)}\n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n aria-label=\"Open AI chat\"\n >\n <span className=\"hsk-cb-btn-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </span>\n {label !== undefined ? label : null}\n </button>\n {open && mounted && createPortal(\n <ChatModal\n title={title}\n placeholder={placeholder}\n backdropColor={backdropColor}\n backdropBlur={backdropBlur}\n onClose={() => setOpen(false)}\n onSelectSource={onSelectSource}\n defaultCurrency={defaultCurrency}\n chips={chips}\n theme={theme}\n classNames={classNames}\n />,\n document.body\n )}\n </>\n );\n}\n","import React from 'react';\nimport type { ChatSource } from '@akropolys/sdk';\n\ninterface ComparisonMatrixProps {\n sources: ChatSource[];\n defaultCurrency?: string;\n}\n\n// ── Spec parsers ──────────────────────────────────────────────────────────────\n\nfunction extractSize(p: ChatSource): string | null {\n const name = p.name;\n const cat = (p.category || '').toLowerCase();\n \n // 1. If there's an explicit unit like \" or inch(es)\n const mExplicit = name.match(/(\\d+(?:\\.\\d+)?)\\s*(?:inch(?:es)?|[\"'″])/i);\n if (mExplicit) {\n return `${mExplicit[1]} inches`;\n }\n \n // 2. If it is a TV and contains a 2-digit size (like 43 in Hisense 43A4K)\n if (cat.includes('tv') || cat.includes('audio')) {\n const mTv = name.match(/\\b(\\d{2})(?:[a-zA-Z]|\\b)/);\n if (mTv) {\n const size = parseInt(mTv[1], 10);\n if (size >= 24 && size <= 120) {\n return `${size} inches`;\n }\n }\n }\n \n return null;\n}\nfunction extractResolution(name: string): string | null {\n if (/\\b4K\\b/i.test(name)) return '4K Ultra HD (2160p)';\n if (/\\bUHD\\b/i.test(name)) return 'Ultra HD (2160p)';\n if (/\\b(?:Full HD|FHD|1080p)\\b/i.test(name)) return 'Full HD (1080p)';\n if (/\\b(?:HD|720p)\\b/i.test(name)) return 'HD (720p)';\n return null;\n}\nfunction extractStorage(name: string): string | null {\n const m = name.match(/(\\d+)\\s*GB(?!\\s*RAM)/i);\n return m ? `${m[1]} GB` : null;\n}\nfunction extractRAM(name: string): string | null {\n const m = name.match(/(\\d+)\\s*GB\\s*RAM/i);\n return m ? `${m[1]} GB` : null;\n}\nfunction extractCamera(name: string): string | null {\n const m = name.match(/(\\d+)\\s*MP/i);\n return m ? `${m[1]} MP` : null;\n}\nfunction extractBattery(name: string): string | null {\n const m = name.match(/(\\d{3,5})\\s*mAh/i);\n return m ? `${m[1]} mAh` : null;\n}\n\n// ── Row types ─────────────────────────────────────────────────────────────────\n\ninterface Row {\n label: string;\n values: (string | null)[];\n type?: 'image' | 'price' | 'availability' | 'text';\n bestIdx?: number;\n}\n\nfunction buildRows(products: ChatSource[], currency: string): Row[] {\n const rows: Row[] = [];\n\n // Image preview\n rows.push({\n label: 'Product Preview',\n values: products.map(s => s.image || null),\n type: 'image',\n });\n\n // Price (lowest = best)\n const prices = products.map(s => {\n const n = parseFloat(String(s.price ?? '').replace(/[^0-9.]/g, ''));\n return isNaN(n) ? null : n;\n });\n const priceLabels = products.map((s, i) => {\n const c = s.currency || currency;\n const n = prices[i];\n return n !== null\n ? `${c} ${n.toLocaleString('en-KE', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`\n : null;\n });\n const validPrices = prices.filter((p): p is number => p !== null);\n const minPrice = validPrices.length ? Math.min(...validPrices) : null;\n rows.push({\n label: 'Price',\n values: priceLabels,\n type: 'price',\n bestIdx: minPrice !== null ? prices.indexOf(minPrice) : undefined,\n });\n\n // Brand\n const brands = products.map(s => s.brand || null);\n if (brands.some(Boolean)) rows.push({ label: 'Brand', values: brands });\n\n // Spec rows — only include if at least one product has a value\n const specDefs: { label: string; fn: (p: ChatSource) => string | null; higherIsBetter?: boolean }[] = [\n { label: 'Display Size', fn: extractSize },\n { label: 'Resolution', fn: p => extractResolution(p.name), higherIsBetter: true },\n { label: 'Storage', fn: p => extractStorage(p.name), higherIsBetter: true },\n { label: 'RAM', fn: p => extractRAM(p.name), higherIsBetter: true },\n { label: 'Camera', fn: p => extractCamera(p.name), higherIsBetter: true },\n { label: 'Battery', fn: p => extractBattery(p.name), higherIsBetter: true },\n ];\n\n const resOrder = ['4K Ultra HD (2160p)', 'Ultra HD (2160p)', 'Full HD (1080p)', 'HD (720p)'];\n\n for (const { label, fn, higherIsBetter } of specDefs) {\n const vals = products.map(s => fn(s));\n if (!vals.some(Boolean)) continue;\n\n let bestIdx: number | undefined;\n if (higherIsBetter && vals.filter(Boolean).length > 1) {\n if (label === 'Resolution') {\n bestIdx = vals.reduce((best, v, i) => {\n const rank = resOrder.indexOf(v ?? '');\n const bestRank = resOrder.indexOf(vals[best] ?? '');\n return rank !== -1 && (bestRank === -1 || rank < bestRank) ? i : best;\n }, 0);\n } else {\n // Numeric comparison — higher wins\n const nums = vals.map(v => parseFloat((v ?? '').replace(/[^0-9.]/g, '')));\n const max = Math.max(...nums.filter(n => !isNaN(n)));\n bestIdx = nums.indexOf(max);\n }\n }\n rows.push({ label, values: vals, bestIdx });\n }\n\n // Availability\n const avail = products.map(s => {\n const a = s.availability ?? '';\n if (!a) return null;\n if (/in.?stock/i.test(a)) return 'In-Stock';\n if (/out.?of.?stock/i.test(a)) return 'Out of Stock';\n return a;\n });\n if (avail.some(Boolean)) {\n rows.push({ label: 'Availability', values: avail, type: 'availability' });\n }\n\n // Category\n const cats = products.map(s => s.category || null);\n if (cats.some(Boolean)) rows.push({ label: 'Category', values: cats });\n\n return rows;\n}\n\n// ── Sub-renderers ─────────────────────────────────────────────────────────────\n\nfunction ImageCell({ value, name }: { value: string | null; name: string }) {\n if (!value) {\n return <div style={{ fontSize: 28, textAlign: 'center' }}>📦</div>;\n }\n return (\n <img\n src={value}\n alt={name}\n style={{\n width: 72,\n height: 72,\n objectFit: 'contain',\n borderRadius: 8,\n background: '#f5f5f5',\n display: 'block',\n }}\n />\n );\n}\n\nfunction AvailabilityCell({ value }: { value: string | null }) {\n if (!value) return <span style={{ color: '#9ca3af' }}>—</span>;\n const inStock = /in.?stock/i.test(value);\n return (\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 13, color: 'var(--hsk-text, #111827)' }}>\n <span style={{\n width: 8, height: 8, borderRadius: '50%', flexShrink: 0,\n background: inStock ? '#22c55e' : '#ef4444',\n boxShadow: inStock ? '0 0 0 3px rgba(34,197,94,0.2)' : '0 0 0 3px rgba(239,68,68,0.2)',\n display: 'inline-block',\n }} />\n {value}\n </span>\n );\n}\n\n// ── Main component ────────────────────────────────────────────────────────────\n\nexport function ComparisonMatrix({ sources, defaultCurrency = 'KES' }: ComparisonMatrixProps) {\n if (sources.length < 2) return null;\n\n const products = sources.slice(0, 3);\n const rows = buildRows(products, defaultCurrency);\n\n const colTemplate = `140px repeat(${products.length}, 1fr)`;\n\n const labelStyle: React.CSSProperties = {\n padding: '10px 12px',\n fontSize: 11,\n fontWeight: 700,\n // Solid dark fallback — never inherit a muted ancestor color\n color: 'var(--hsk-text-muted, #4b5563)',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n borderBottom: '1px solid var(--hsk-border, rgba(0,0,0,0.07))',\n verticalAlign: 'middle',\n whiteSpace: 'nowrap',\n display: 'flex',\n alignItems: 'center',\n };\n\n const cellBase: React.CSSProperties = {\n padding: '10px 14px',\n fontSize: 13,\n // Explicit color so cells are always readable regardless of parent theme\n color: 'var(--hsk-text, #111827)',\n borderBottom: '1px solid var(--hsk-border, rgba(0,0,0,0.07))',\n verticalAlign: 'middle',\n display: 'flex',\n alignItems: 'center',\n };\n\n return (\n <div\n className=\"hsk-compare-matrix\"\n style={{\n marginTop: 10,\n borderRadius: 12,\n overflow: 'hidden',\n border: '1px solid var(--hsk-border, rgba(0,0,0,0.09))',\n background: 'var(--hsk-surface, #fff)',\n fontSize: 13,\n }}\n >\n {/* ── Header ── */}\n <div style={{ display: 'grid', gridTemplateColumns: colTemplate, background: 'var(--hsk-surface2, #f9fafb)', borderBottom: '2px solid var(--hsk-border, rgba(0,0,0,0.09))' }}>\n <div style={{ ...labelStyle, borderBottom: 'none', color: 'var(--hsk-text, #111)', fontSize: 12 }}>Feature</div>\n {products.map((p, i) => (\n <a\n key={i}\n href={p.url || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: '10px 14px',\n fontSize: 12,\n fontWeight: 700,\n color: 'var(--hsk-primary, #16a34a)',\n textDecoration: 'none',\n lineHeight: 1.3,\n borderLeft: i > 0 ? '1px solid var(--hsk-border, rgba(0,0,0,0.07))' : 'none',\n }}\n >\n {p.name}\n </a>\n ))}\n </div>\n\n {/* ── Data rows ── */}\n {rows.map((row, rowIdx) => (\n <div\n key={rowIdx}\n style={{\n display: 'grid',\n gridTemplateColumns: colTemplate,\n background: rowIdx % 2 === 1 ? 'var(--hsk-surface2, rgba(0,0,0,0.015))' : 'transparent',\n }}\n >\n {/* Label */}\n <div style={labelStyle}>{row.label}</div>\n\n {/* Values */}\n {products.map((p, i) => {\n const val = row.values[i];\n const isBest = row.bestIdx === i && row.values.filter(Boolean).length > 1;\n\n if (row.type === 'image') {\n return (\n <div key={i} style={{ ...cellBase, justifyContent: 'center', padding: '12px', borderLeft: i > 0 ? '1px solid var(--hsk-border, rgba(0,0,0,0.07))' : 'none' }}>\n <ImageCell value={val} name={p.name} />\n </div>\n );\n }\n if (row.type === 'availability') {\n return (\n <div key={i} style={{ ...cellBase, borderLeft: i > 0 ? '1px solid var(--hsk-border, rgba(0,0,0,0.07))' : 'none' }}>\n <AvailabilityCell value={val} />\n </div>\n );\n }\n return (\n <div\n key={i}\n style={{\n ...cellBase,\n fontWeight: isBest ? 700 : 400,\n // Always use a solid dark fallback — never 'inherit' which can be muted/invisible\n color: isBest\n ? 'var(--hsk-primary, #ea580c)'\n : row.type === 'price'\n ? 'var(--hsk-text, #374151)' // non-cheapest price: visible but not highlighted\n : 'var(--hsk-text, #111827)',\n borderLeft: i > 0 ? '1px solid var(--hsk-border, rgba(0,0,0,0.07))' : 'none',\n }}\n >\n {val ?? <span style={{ color: '#9ca3af' }}>—</span>}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useSearch, useKiku, useAkropolysContext } from '@akropolys/sdk';\nimport { renderMarkdown } from '../utils/markdown';\nimport { SearchResult, Product, AkropolysTheme } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\n\nexport interface SparkleProps {\n productName: string;\n limit?: number;\n onResult?: (results: SearchResult[]) => void;\n /** Override the backdrop colour (any CSS colour/gradient) */\n backdropColor?: string;\n /** Override backdrop blur — e.g. \"8px\" or 8 */\n backdropBlur?: string | number;\n /** Extra classes on the trigger button */\n className?: string;\n /** Called when user clicks a result — return false to prevent default navigation */\n onNavigate?: (result: SearchResult) => boolean | void;\n theme?: AkropolysTheme;\n classNames?: {\n button?: string;\n backdrop?: string;\n card?: string;\n item?: string;\n };\n product?: Product;\n children?: React.ReactNode;\n}\n\n/* ── Modal ────────────────────────────────────────────────────────────────── */\ninterface ModalProps extends Pick<SparkleProps, 'productName' | 'limit' | 'backdropColor' | 'backdropBlur' | 'onNavigate' | 'onResult' | 'theme' | 'classNames' | 'product'> {\n onClose: () => void;\n}\n\nconst SparkleIcon = ({ className, size = 16 }: { className?: string; size?: number }) => (\n <svg\n className={cn(\"hsk-brand-a\", className)}\n width={size}\n height={size}\n viewBox=\"0 0 28 30\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-label=\"Akropolys\"\n >\n {/* Left leg: elegant thin stroke */}\n <path\n d=\"M14.5 4.5 L6.5 25\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n />\n {/* Right leg: bold ancient serif thick stroke */}\n <path\n d=\"M14.5 4.5 L22.5 25\"\n stroke=\"currentColor\"\n strokeWidth=\"4.2\"\n strokeLinecap=\"round\"\n />\n {/* Crossbar */}\n <path\n d=\"M9.5 17 H19.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n {/* Left base serif */}\n <path\n d=\"M3 25 H10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n {/* Right base serif */}\n <path\n d=\"M19 25 H26\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n {/* Smooth breathing mark (spiritus lenis) at top-left — animated */}\n <path\n d=\"M8.5 2.5 C10 2.5, 11 3.5, 11 5 C11 7, 8.5 8.5, 7.5 9.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n className=\"hsk-akr-breath\"\n />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n);\n\nconst ArrowUpIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\"/>\n <path d=\"M12 19V5\"/>\n </svg>\n);\n\n/* ── Modal ────────────────────────────────────────────────────────────────── */\ninterface ModalProps extends Pick<SparkleProps, 'productName' | 'limit' | 'backdropColor' | 'backdropBlur' | 'onNavigate' | 'onResult' | 'theme' | 'classNames' | 'product'> {\n onClose: () => void;\n}\n\nconst getFriendlyError = (err: any) => {\n let str = '';\n if (typeof err === 'string') str = err;\n else if (err && typeof err === 'object' && err.message) str = err.message;\n else try { str = JSON.stringify(err); } catch { str = String(err); }\n\n if (str.toLowerCase().includes('token limit')) {\n return \"You've reached your usage limit. Please update your billing limits in your dashboard to continue.\";\n }\n\n try {\n const parsed = JSON.parse(str);\n return parsed.error || parsed.message || str;\n } catch {\n return str;\n }\n};\n\nfunction SparkleModal({ \n productName, \n limit, \n backdropColor, \n backdropBlur, \n onClose, \n onNavigate, \n onResult,\n theme,\n classNames = {},\n product: initialProduct,\n}: ModalProps) {\n const client = useAkropolysContext();\n const [fetchedProduct, setFetchedProduct] = useState<Product | null>(null);\n const displayProduct = initialProduct || fetchedProduct;\n const { results, loading: searchLoading, search } = useSearch();\n const { messages, sources, loading: chatLoading, error: chatError, send } = useKiku();\n const [chatInput, setChatInput] = useState('');\n const chatBottomRef = useRef<HTMLDivElement>(null);\n const chatTextareaRef = useRef<HTMLTextAreaElement>(null);\n\n /* auto-search and product fetching on open */\n useEffect(() => {\n if (!initialProduct && !fetchedProduct) {\n client.api.searchVector(productName, 1)\n .then(res => {\n if (res.results && res.results.length > 0) {\n setFetchedProduct(res.results[0].product);\n }\n })\n .catch(err => console.error('[Akropolys] Failed to fetch product details', err));\n }\n search(productName, limit);\n }, [productName, initialProduct, fetchedProduct, client, limit, search]);\n\n /* fire callback */\n useEffect(() => { if (results.length > 0) onResult?.(results); }, [results, onResult]);\n\n /* Escape key */\n useEffect(() => {\n const h = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', h);\n return () => document.removeEventListener('keydown', h);\n }, [onClose]);\n\n /* Scroll chat to bottom */\n useEffect(() => {\n chatBottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, chatLoading]);\n\n const blurVal = typeof backdropBlur === 'number' ? `${backdropBlur}px` : (backdropBlur ?? '16px');\n const bg = backdropColor ?? undefined;\n\n const handleNav = (r: SearchResult) => {\n const prevent = onNavigate?.(r);\n if (prevent !== false) {\n onClose();\n if (r.product.url) window.location.href = r.product.url;\n }\n };\n\n const handleSend = async (text?: string) => {\n const q = (text ?? chatInput).trim();\n if (!q || chatLoading) return;\n setChatInput('');\n if (chatTextareaRef.current) {\n chatTextareaRef.current.style.height = 'auto';\n }\n\n if (messages.length === 0 && displayProduct) {\n const contextQuery = `[Context: Shopper is viewing \"${displayProduct.name}\". Price: ${displayProduct.price}. Description: ${displayProduct.description || ''}]\\n\\nQuestion: ${q}`;\n await send(contextQuery, q);\n } else {\n await send(q);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); }\n };\n\n const handleInput = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setChatInput(e.target.value);\n const t = e.target;\n t.style.height = 'auto';\n t.style.height = `${Math.min(t.scrollHeight, 140)}px`;\n };\n\n const customStyles = {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties;\n\n const displayMessages = messages.length === 0 && displayProduct\n ? [\n {\n role: 'assistant' as const,\n content: `Hi! I can help you with **${displayProduct.name}**. Ask me about its specifications, features, compare it with other options, or find alternatives!`,\n },\n ]\n : messages;\n\n return (\n <div\n className={cn(\"hsk-sp-backdrop\", classNames.backdrop)}\n onClick={onClose}\n style={{\n backdropFilter: `blur(${blurVal})`,\n WebkitBackdropFilter: `blur(${blurVal})`,\n background: bg ?? undefined,\n ...customStyles,\n }}\n >\n <div className={cn(\"hsk-sp-card hsk-sp-fullscreen\", classNames.card)} onClick={e => e.stopPropagation()}>\n <div className=\"hsk-sp-header\">\n <span className=\"hsk-sp-header-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </span>\n <div className=\"hsk-sp-header-body\">\n <div className=\"hsk-sp-header-title\">{displayProduct?.name || productName}</div>\n <div className=\"hsk-sp-header-sub\">Ask questions, compare specs, or check similar products</div>\n </div>\n <button className=\"hsk-sp-close\" onClick={onClose} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n\n {searchLoading && <div className=\"hsk-sp-bar\" />}\n\n {/* Split pane body */}\n <div className=\"hsk-sp-body\">\n {/* Left Pane: Product Profile */}\n <div className=\"hsk-sp-details-pane\">\n {displayProduct && (\n <div className=\"hsk-sp-product-profile-container\">\n <div className=\"hsk-sp-product-profile\">\n <div className=\"hsk-sp-details-imgwrap\">\n {displayProduct.images?.[0] ? (\n <img src={displayProduct.images[0]} alt={displayProduct.name} />\n ) : (\n <span className=\"hsk-sp-img-placeholder\">🛍</span>\n )}\n </div>\n <div className=\"hsk-sp-details-meta\">\n {displayProduct.brand && <span className=\"hsk-sp-item-brand\">{displayProduct.brand}</span>}\n {displayProduct.category && <span className=\"hsk-sp-item-cat\">{displayProduct.category}</span>}\n <h2 className=\"hsk-sp-details-name\">{displayProduct.name}</h2>\n <div className=\"hsk-sp-item-price-row\">\n <span className=\"hsk-sp-item-currency\">{displayProduct.currency ?? 'KES'}</span>\n <span className=\"hsk-sp-item-price\">{parseFloat(displayProduct.price?.replace(/[^0-9.]/g, '') || '0').toLocaleString()}</span>\n {displayProduct.originalPrice && (\n <span className=\"hsk-sp-item-original-price\">\n {parseFloat(displayProduct.originalPrice.replace(/[^0-9.]/g, '') || '0').toLocaleString()}\n </span>\n )}\n {displayProduct.discount && (\n <span className=\"hsk-sp-item-discount\">({displayProduct.discount})</span>\n )}\n </div>\n \n <div className=\"hsk-sp-item-meta-badges\">\n {displayProduct.rating && (\n <span className=\"hsk-sp-meta-badge hsk-sp-meta-badge-rating\">\n ★ {parseFloat(displayProduct.rating.toString()).toFixed(1)} {displayProduct.reviewCount ? `(${displayProduct.reviewCount})` : ''}\n </span>\n )}\n {displayProduct.availability && (\n <span className={`hsk-sp-meta-badge hsk-sp-meta-badge-avail ${displayProduct.availability.toLowerCase().includes('in') ? 'in-stock' : 'out-stock'}`}>\n {displayProduct.availability}\n </span>\n )}\n {displayProduct.stock && !displayProduct.availability && (\n <span className=\"hsk-sp-meta-badge hsk-sp-meta-badge-stock\">\n Stock: {displayProduct.stock}\n </span>\n )}\n </div>\n </div>\n </div>\n\n {displayProduct.specs && Object.keys(displayProduct.specs).length > 0 && (\n <div className=\"hsk-sp-specs-horizontal\">\n {Object.entries(displayProduct.specs).map(([key, val]) => (\n <div key={key} className=\"hsk-sp-spec-item-horizontal\">\n <span className=\"hsk-sp-spec-label-horizontal\">{key}:</span>\n <span className=\"hsk-sp-spec-value-horizontal\" title={val}>{val}</span>\n </div>\n ))}\n </div>\n )}\n\n {displayProduct.description && (\n <div className=\"hsk-sp-details-desc\">\n <h4>Description</h4>\n <p>{displayProduct.description}</p>\n </div>\n )}\n </div>\n )}\n\n {/* Similar Products */}\n <div className=\"hsk-sp-similar-section\">\n <h3>Similar Products</h3>\n <div className=\"hsk-sp-results\">\n {(() => {\n const similarProducts = results.filter(\n r => {\n const isSameName = r.product.name.toLowerCase() === displayProduct?.name?.toLowerCase();\n const isSameSlug = r.product.slug && displayProduct?.slug && r.product.slug.toLowerCase() === displayProduct.slug.toLowerCase();\n return !isSameName && !isSameSlug;\n }\n );\n\n if (!searchLoading && similarProducts.length === 0) {\n return <div className=\"hsk-sp-empty\">No similar products found.</div>;\n }\n\n return similarProducts.map((r, i) => {\n const price = parseFloat(r.product.price?.replace(/[^0-9.]/g, '') || '0');\n const currency = r.product.currency ?? 'KES';\n return (\n <div\n key={r.id}\n className={cn(\"hsk-sp-item\", classNames.item)}\n style={{ animationDelay: `${i * 55}ms` }}\n >\n <div className=\"hsk-sp-img-wrap\">\n {r.product.images?.[0] ? (\n <img src={r.product.images[0]} alt={r.product.name} />\n ) : (\n <span className=\"hsk-sp-img-placeholder\">🛍</span>\n )}\n </div>\n <div className=\"hsk-sp-item-body\">\n <div>\n {r.product.category && (\n <div className=\"hsk-sp-item-cat\">{r.product.category}</div>\n )}\n <div className=\"hsk-sp-item-name\" title={r.product.name}>{r.product.name}</div>\n </div>\n <div className=\"hsk-sp-item-price-row\">\n <span className=\"hsk-sp-item-currency\">{currency}</span>\n <span className=\"hsk-sp-item-price\">{price.toLocaleString()}</span>\n </div>\n <div className=\"hsk-sp-actions\">\n <button\n className=\"hsk-sp-action hsk-sp-action-primary\"\n onClick={() => handleNav(r)}\n >\n View\n </button>\n </div>\n </div>\n </div>\n );\n });\n })()}\n </div>\n </div>\n </div>\n\n {/* Right Pane: AI Chat Assistant */}\n <div className=\"hsk-sp-chat-pane\">\n <div className=\"hsk-cb-msgs\">\n {displayMessages.map((msg, idx) => {\n const isUser = msg.role === 'user';\n return (\n <div key={idx} className=\"hsk-cb-msg-group\">\n {isUser ? (\n <div className=\"hsk-cb-user-msg\">\n <div className=\"hsk-cb-user-bubble\">{msg.content}</div>\n </div>\n ) : (\n <div className=\"hsk-cb-ai-msg\">\n <div className=\"hsk-cb-ai-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </div>\n <div className=\"hsk-cb-ai-body\">\n <div className=\"hsk-cb-ai-text\">{renderMarkdown(msg.content)}</div>\n </div>\n </div>\n )}\n </div>\n );\n })}\n\n {chatLoading && (\n <div className=\"hsk-cb-typing-row\">\n <div className=\"hsk-cb-ai-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n <SparkleIcon />\n </div>\n <div className=\"hsk-cb-typing\">\n <div className=\"hsk-cb-dot\" />\n <div className=\"hsk-cb-dot\" />\n <div className=\"hsk-cb-dot\" />\n </div>\n </div>\n )}\n\n {chatError && <div className=\"hsk-cb-error\">{getFriendlyError(chatError)}</div>}\n <div ref={chatBottomRef} style={{ height: 1 }} />\n </div>\n\n <div className=\"hsk-cb-input-wrap\">\n <div className=\"hsk-cb-input-box\">\n <textarea\n ref={chatTextareaRef}\n className=\"hsk-cb-textarea\"\n value={chatInput}\n onChange={handleInput}\n onKeyDown={handleKeyDown}\n placeholder=\"Ask about this product, specs, or comparison...\"\n rows={1}\n disabled={chatLoading}\n />\n <button\n className=\"hsk-cb-send\"\n onClick={() => handleSend()}\n disabled={!chatInput.trim() || chatLoading}\n aria-label=\"Send message\"\n >\n <ArrowUpIcon />\n </button>\n </div>\n <div className=\"hsk-cb-hint\">Akropolys &middot; instant product knowledge</div>\n </div>\n </div>\n </div>\n\n <div className=\"hsk-sp-footer\">\n <span className=\"hsk-sp-esc\">Esc to close</span>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Exported component ───────────────────────────────────────────────────── */\nexport function Sparkle({ \n productName, \n limit = 8, \n onResult, \n backdropColor, \n backdropBlur, \n className, \n onNavigate,\n theme,\n classNames = {},\n product,\n children,\n}: SparkleProps) {\n const [open, setOpen] = useState(false);\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => { setMounted(true); }, []);\n\n const customStyles = {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties;\n\n return (\n <>\n <button\n className={cn(\"hsk-sp-btn\", classNames.button, className)}\n onClick={() => setOpen(true)}\n style={customStyles}\n title=\"Find similar products\"\n aria-label=\"Find similar products\"\n >\n {children || <SparkleIcon />}\n </button>\n {open && mounted && createPortal(\n <SparkleModal\n productName={productName}\n limit={limit}\n onResult={onResult}\n backdropColor={backdropColor}\n backdropBlur={backdropBlur}\n onClose={() => setOpen(false)}\n onNavigate={onNavigate}\n theme={theme}\n classNames={classNames}\n product={product}\n />,\n document.body\n )}\n </>\n );\n}\n","import React from 'react';\nimport { useCart } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\n\nexport function CartBadge({ className }: { className?: string }) {\n const { cart } = useCart();\n \n if (!cart || cart.item_count === 0) return null;\n \n return (\n <span className={cn(\"hsk-cart-badge\", className)}>\n {cart.item_count}\n </span>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useCart, useAkropolysContext, AkropolysTheme } from '@akropolys/sdk';\nimport { CheckoutModal } from './CheckoutModal';\nimport { cn } from '../utils/cn';\n\nexport function CartDrawer({ \n trigger, \n className,\n theme \n}: { \n trigger?: React.ReactNode, \n className?: string,\n theme?: 'light' | 'dark' | AkropolysTheme \n}) {\n const { cart, loading } = useCart();\n const [open, setOpen] = useState(false);\n const [showCheckout, setShowCheckout] = useState(false);\n const [mounted, setMounted] = useState(false);\n const client = useAkropolysContext();\n\n useEffect(() => {\n setMounted(true);\n const handleTriggerCheckout = () => {\n setShowCheckout(true);\n setOpen(false);\n };\n window.addEventListener('akropolys:trigger_checkout', handleTriggerCheckout);\n return () => {\n window.removeEventListener('akropolys:trigger_checkout', handleTriggerCheckout);\n };\n }, []);\n\n // Block body scroll when drawer is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => { document.body.style.overflow = ''; };\n }, [open]);\n\n const handleCheckout = async () => {\n if (!cart || cart.items.length === 0) return;\n \n const event = new CustomEvent('akropolys:trigger_checkout', { cancelable: true });\n window.dispatchEvent(event);\n \n if (event.defaultPrevented) {\n setOpen(false);\n return;\n }\n \n setShowCheckout(true);\n };\n\n const isStringTheme = typeof theme === 'string';\n const hskThemeAttr = isStringTheme ? theme : undefined;\n \n const customStyles = (!isStringTheme && theme) ? {\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor, '--hsk-primary-color': theme.primaryColor }),\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\n } as React.CSSProperties : undefined;\n\n return (\n <>\n {trigger ? (\n <div onClick={() => setOpen(true)} style={{ display: 'inline-block' }}>\n {trigger}\n </div>\n ) : (\n <button \n onClick={() => setOpen(true)}\n className={cn(\"hsk-cart-trigger\", className)} \n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n aria-label=\"Open cart\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"9\" cy=\"21\" r=\"1\"></circle>\n <circle cx=\"20\" cy=\"21\" r=\"1\"></circle>\n <path d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"></path>\n </svg>\n {cart && cart.item_count > 0 ? (\n <span className=\"hsk-cart-trigger-badge\">{cart.item_count}</span>\n ) : null}\n </button>\n )}\n \n {open && mounted && createPortal(\n <div \n className=\"hsk-cart-backdrop\" \n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n onClick={() => setOpen(false)}\n >\n <div \n className=\"hsk-cart-bottom-sheet\" \n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"hsk-cart-sheet-handle\" />\n \n <div className=\"hsk-cart-sheet-header\">\n <h2>Your Cart</h2>\n <button onClick={() => setOpen(false)} className=\"hsk-close-btn\">&times;</button>\n </div>\n \n <div className=\"hsk-cart-sheet-content\">\n {loading && !cart ? (\n <div className=\"hsk-cart-loading\">Loading cart...</div>\n ) : !cart || cart.items.length === 0 ? (\n <div className=\"hsk-cart-empty\">Your cart is empty.</div>\n ) : (\n <ul className=\"hsk-cart-items\">\n {cart.items.map(item => (\n <li key={item.id} className=\"hsk-cart-item\">\n {item.image && <img src={item.image} alt={item.name} className=\"hsk-cart-item-img\" />}\n <div className=\"hsk-cart-item-info\">\n <span className=\"hsk-cart-item-name\">{item.name}</span>\n <span className=\"hsk-cart-item-price\">{item.currency} {item.price_numeric.toLocaleString(undefined, { minimumFractionDigits: 2 })}</span>\n </div>\n <div className=\"hsk-cart-item-qty\">x{item.quantity}</div>\n </li>\n ))}\n </ul>\n )}\n </div>\n \n {cart && cart.items.length > 0 && (\n <div className=\"hsk-cart-sheet-footer\">\n <div className=\"hsk-cart-total\">\n <span>Total</span>\n <span>{cart.currency} {cart.total.toLocaleString(undefined, { minimumFractionDigits: 2 })}</span>\n </div>\n <button onClick={handleCheckout} className=\"hsk-checkout-btn\">\n Checkout securely\n </button>\n </div>\n )}\n </div>\n </div>,\n document.body\n )}\n\n {showCheckout && mounted && (\n <CheckoutModal \n onClose={() => {\n setShowCheckout(false);\n setOpen(false);\n }}\n theme={isStringTheme ? (theme as string) : undefined}\n customStyles={customStyles}\n hskThemeAttr={hskThemeAttr}\n />\n )}\n </>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useCart, useAkropolysContext, usePaymentPolling } from '@akropolys/sdk';\n\ntype Phase = 'idle' | 'awaiting' | 'done' | 'failed' | 'cancelled';\n\nexport function CheckoutModal({\n onClose,\n theme,\n customStyles,\n hskThemeAttr\n}: {\n onClose: () => void;\n theme?: string;\n customStyles?: React.CSSProperties;\n hskThemeAttr?: string;\n}) {\n const { cart, loading: cartLoading } = useCart();\n const client = useAkropolysContext();\n const [config, setConfig] = useState<any>(null);\n const [loadingConfig, setLoadingConfig] = useState(true);\n\n // Form fields prefilled from localStorage\n const [phone, setPhone] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_phone') || '';\n }\n return '';\n });\n const [email, setEmail] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_email') || '';\n }\n return '';\n });\n const [firstName, setFirstName] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_firstname') || '';\n }\n return '';\n });\n const [lastName, setLastName] = useState(() => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem('akropolys_user_lastname') || '';\n }\n return '';\n });\n\n // Payment state\n const [phase, setPhase] = useState<Phase>('idle');\n const [merchantRef, setMerchantRef] = useState<string | null>(null);\n const [payError, setPayError] = useState<string | null>(null);\n\n // Poll for payment confirmation\n const { } = usePaymentPolling({\n client: client.api,\n merchantReference: merchantRef,\n onSuccess: () => { setPhase('done'); setMerchantRef(null); },\n onFailure: () => {\n setPhase('failed');\n setPayError('Payment failed or timed out. Please try again.');\n setMerchantRef(null);\n },\n });\n\n useEffect(() => {\n client.api.getCheckoutConfig()\n .then(res => setConfig(res.payment_methods))\n .catch(() => {})\n .finally(() => setLoadingConfig(false));\n }, [client]);\n\n const hasPaymentMethods = config && Object.values(config).some((m: any) => m.enabled);\n\n const handlePay = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!phone.trim()) { setPayError('Phone number is required.'); return; }\n setPayError(null);\n setPhase('awaiting');\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem('akropolys_user_phone', phone.trim());\n localStorage.setItem('akropolys_user_email', email.trim());\n localStorage.setItem('akropolys_user_firstname', firstName.trim());\n localStorage.setItem('akropolys_user_lastname', lastName.trim());\n }\n const res = await client.api.initiatePayment(phone.trim(), email, firstName, lastName);\n if (res?.merchantReference) {\n setMerchantRef(res.merchantReference);\n } else {\n throw new Error('No merchant reference returned.');\n }\n } catch (err: any) {\n setPhase('failed');\n setPayError(err.message || 'Could not connect to payment processor.');\n }\n };\n\n const currency = cart?.currency || 'KES';\n const total = cart?.total || 0;\n\n const backdropStyle: React.CSSProperties = { ...customStyles, fontSize: '15px', fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif', zIndex: 999999 };\n\n return createPortal(\n <div\n className=\"hsk-checkout-backdrop-full\"\n style={backdropStyle}\n data-hsk-theme={hskThemeAttr}\n >\n <div\n className=\"hsk-checkout-modal-full\"\n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n >\n <button \n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onClose(); }} \n className=\"hsk-checkout-close-x\"\n aria-label=\"Close checkout\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n\n {/* Left Panel: Order Summary */}\n <div className=\"hsk-checkout-panel-left\">\n <div className=\"hsk-checkout-left-content\">\n <button onClick={(e) => { e.preventDefault(); e.stopPropagation(); onClose(); }} className=\"hsk-checkout-back-btn\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\n <polyline points=\"12 19 5 12 12 5\"></polyline>\n </svg>\n Back to store\n </button>\n \n <div className=\"hsk-checkout-store-info\">\n <h2>Secure Checkout</h2>\n </div>\n \n <div className=\"hsk-checkout-amount-due\">\n <span className=\"hsk-checkout-label-muted\">Pay total</span>\n <div className=\"hsk-checkout-grand-total\">\n {currency} {total.toLocaleString(undefined, { minimumFractionDigits: 2 })}\n </div>\n </div>\n \n {cartLoading || !cart ? (\n <p className=\"hsk-cart-loading\">Loading order...</p>\n ) : (\n <div className=\"hsk-checkout-items-list-wrap\">\n <ul className=\"hsk-checkout-items-list\">\n {cart.items.map(item => (\n <li key={item.id} className=\"hsk-checkout-item-row\">\n <div className=\"hsk-checkout-item-img-container\">\n {item.image ? (\n <img src={item.image} alt={item.name} className=\"hsk-checkout-item-img\" />\n ) : (\n <div className=\"hsk-checkout-item-img-placeholder\">🛒</div>\n )}\n <span className=\"hsk-checkout-item-qty-badge\">{item.quantity}</span>\n </div>\n <div className=\"hsk-checkout-item-details\">\n <span className=\"hsk-checkout-item-name\">{item.name}</span>\n </div>\n <span className=\"hsk-checkout-item-price\">\n {item.currency} {(item.price_numeric * item.quantity).toLocaleString(undefined, { minimumFractionDigits: 2 })}\n </span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </div>\n\n {/* Right Panel: Payment Forms & Status */}\n <div className=\"hsk-checkout-panel-right\">\n <div className=\"hsk-checkout-right-content\">\n {phase === 'done' ? (\n <div className=\"hsk-checkout-status-card success\">\n <div className=\"hsk-status-icon-wrap success\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>\n <polyline points=\"22 4 12 14.01 9 11.01\"/>\n </svg>\n </div>\n <h3>Payment Successful!</h3>\n <p>Your transaction has been confirmed. Thank you for your order!</p>\n <button onClick={onClose} className=\"hsk-pay-btn hsk-btn-primary\" style={{ marginTop: '1.5rem' }}>\n Continue Shopping\n </button>\n </div>\n ) : phase === 'awaiting' ? (\n <div className=\"hsk-checkout-status-card awaiting\">\n <div className=\"hsk-status-spinner-wrap\">\n <div className=\"hsk-status-spinner\"></div>\n </div>\n <h3>Confirm payment on your phone</h3>\n <p>We've sent an M-Pesa STK push prompt to <strong>254{phone}</strong>.</p>\n <div className=\"hsk-checkout-stk-instructions\">\n <p>1. Check your phone lockscreen for the M-Pesa prompt.</p>\n <p>2. Enter your M-Pesa PIN and press OK.</p>\n <p>3. Wait here — this page auto-updates once confirmed.</p>\n </div>\n <button\n onClick={() => { setPhase('cancelled'); setMerchantRef(null); }}\n className=\"hsk-checkout-cancel-btn\"\n >\n Cancel payment\n </button>\n </div>\n ) : phase === 'cancelled' ? (\n <div className=\"hsk-checkout-status-card cancelled\">\n <div className=\"hsk-status-icon-wrap cancelled\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m15 9-6 6M9 9l6 6\"/>\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n </svg>\n </div>\n <h3>Payment Cancelled</h3>\n <p>No charge was made. You can update your phone number and try again whenever you're ready.</p>\n <div className=\"hsk-checkout-status-actions\">\n <button onClick={() => { setPhase('idle'); setPayError(null); }} className=\"hsk-pay-btn hsk-btn-primary\">\n Try again\n </button>\n <button onClick={onClose} className=\"hsk-checkout-cancel-btn\">\n Back to cart\n </button>\n </div>\n </div>\n ) : phase === 'failed' ? (\n <div className=\"hsk-checkout-status-card failed\">\n <div className=\"hsk-status-icon-wrap failed\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n </div>\n <h3>Payment Failed</h3>\n <p className=\"hsk-checkout-error-text\">{payError || 'Could not verify M-Pesa transaction. Please check your phone and try again.'}</p>\n <div className=\"hsk-checkout-status-actions\">\n <button onClick={() => { setPhase('idle'); setPayError(null); }} className=\"hsk-pay-btn hsk-btn-primary\">\n Try again\n </button>\n <button onClick={onClose} className=\"hsk-checkout-cancel-btn\">\n Back to cart\n </button>\n </div>\n </div>\n ) : (\n <div className=\"hsk-checkout-payment-form-wrap\">\n <h3 className=\"hsk-checkout-section-title\">Payment details</h3>\n {loadingConfig ? (\n <p className=\"hsk-cart-loading\">Loading payment configuration...</p>\n ) : !hasPaymentMethods ? (\n <p className=\"hsk-checkout-error\">No payment methods configured for this store.</p>\n ) : (\n <form onSubmit={handlePay} className=\"hsk-stripe-checkout-form\">\n \n {/* Phone field */}\n <div className=\"hsk-form-group\">\n <label className=\"hsk-form-label\">M-Pesa Mobile Number</label>\n <div className=\"hsk-phone-input-container\">\n <span className=\"hsk-phone-prefix\">254</span>\n <input\n type=\"tel\"\n required\n placeholder=\"712345678\"\n pattern=\"[0-9]{9}\"\n maxLength={9}\n value={phone}\n onChange={e => setPhone(e.target.value.replace(/\\D/g, ''))}\n className=\"hsk-phone-input-field\"\n />\n </div>\n <span className=\"hsk-form-hint\">Enter your 9-digit number (e.g. 712345678)</span>\n </div>\n\n {/* Email field */}\n <div className=\"hsk-form-group\">\n <label className=\"hsk-form-label\">Email address</label>\n <input\n type=\"email\"\n placeholder=\"john.doe@example.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n className=\"hsk-form-input\"\n />\n </div>\n\n {/* Name row */}\n <div className=\"hsk-form-row\">\n <div className=\"hsk-form-group\">\n <label className=\"hsk-form-label\">First Name</label>\n <input\n type=\"text\"\n placeholder=\"John\"\n value={firstName}\n onChange={e => setFirstName(e.target.value)}\n className=\"hsk-form-input\"\n />\n </div>\n <div className=\"hsk-form-group\">\n <label className=\"hsk-form-label\">Last Name</label>\n <input\n type=\"text\"\n placeholder=\"Doe\"\n value={lastName}\n onChange={e => setLastName(e.target.value)}\n className=\"hsk-form-input\"\n />\n </div>\n </div>\n\n {payError && (\n <div className=\"hsk-form-error-banner\">\n {payError}\n </div>\n )}\n\n <button type=\"submit\" className=\"hsk-checkout-submit-btn\">\n Pay {currency} {total.toLocaleString()}\n </button>\n \n <div className=\"hsk-checkout-footer-brand\">\n <span>Powered by Akropolys</span>\n </div>\n </form>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}\n"],"mappings":"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","names":["useState","useRef","useEffect","Fragment","jsx","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","useRef","useKiku","useAkropolysContext","jsx","jsxs","Fragment","jsx","jsxs","SparkleIcon","ArrowUpIcon","useAkropolysContext","useRef","useState","useEffect","useKiku","useState","useEffect","useRef","createPortal","useSearch","useKiku","useAkropolysContext","Fragment","jsx","jsxs","SparkleIcon","CloseIcon","ArrowUpIcon","getFriendlyError","useAkropolysContext","useState","useSearch","useKiku","useRef","useEffect","createPortal","jsx","useState","useEffect","createPortal","useCart","useAkropolysContext","useState","useEffect","createPortal","useCart","useAkropolysContext","usePaymentPolling","jsx","jsxs","Fragment","jsx","jsxs","useCart","useState","useAkropolysContext","useEffect","createPortal"]}