@guidekit/react 0.1.0-beta.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx"],"names":[],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAA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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// @guidekit/react — React bindings for GuideKit SDK\n// ---------------------------------------------------------------------------\n//\n// Provides: GuideKitProvider, split hooks (useGuideKitStatus, useGuideKitVoice,\n// useGuideKitActions, useGuideKitContext), combined useGuideKit hook, and an\n// internal GuideKitWidget rendered inside Shadow DOM.\n//\n// All hooks use React 18's useSyncExternalStore for tear-free, concurrent-mode\n// safe reads from the GuideKitCore store. Functions are memoised with\n// useCallback so they are referentially stable across renders.\n// ---------------------------------------------------------------------------\n\nimport { GuideKitCore } from '@guidekit/core';\nimport type {\n GuideKitCoreOptions,\n GuideKitProviderProps,\n AgentState,\n GuideKitStore,\n GuideKitErrorType,\n GuideKitEvent,\n} from '@guidekit/core';\n\nimport React, {\n useContext,\n useEffect,\n useRef,\n useCallback,\n useSyncExternalStore,\n useState,\n} from 'react';\nimport type { ReactNode } from 'react';\n\nimport { GuideKitContext } from './_context.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** SSR-safe default snapshot returned when there is no GuideKitCore instance. */\nconst SSR_SNAPSHOT: GuideKitStore = {\n status: { isReady: false, agentState: { status: 'idle' }, error: null },\n voice: { isListening: false, isSpeaking: false },\n hasConsent: false,\n};\n\n/** Noop subscriber for SSR — never fires, returns a stable unsubscribe. */\nconst SSR_SUBSCRIBE = (_listener: () => void): (() => void) => () => {};\n\n// ---------------------------------------------------------------------------\n// Internal hook: access the core instance from context\n// ---------------------------------------------------------------------------\n\nfunction useGuideKitCore(): GuideKitCore | null {\n return useContext(GuideKitContext);\n}\n\n// ---------------------------------------------------------------------------\n// GuideKitProvider\n// ---------------------------------------------------------------------------\n\nexport function GuideKitProvider(\n props: GuideKitProviderProps & { children: ReactNode },\n) {\n const {\n children,\n tokenEndpoint,\n stt,\n tts,\n llm,\n agent,\n contentMap,\n options,\n theme,\n locale: _locale,\n instanceId,\n rootElement,\n onError,\n onEvent,\n onReady,\n onBeforeLLMCall,\n } = props;\n\n // Use a ref so the core instance is created once and never causes re-renders.\n // We also track whether the ref was initialised to avoid re-creating after\n // React StrictMode's double-mount (SingletonGuard handles concurrency, but\n // we still want to be explicit).\n const coreRef = useRef<GuideKitCore | null>(null);\n const initCalled = useRef(false);\n\n // Build the options object. We memoise the option values but the core is\n // created imperatively, not via state — this avoids render-triggered side\n // effects.\n if (coreRef.current === null) {\n const coreOptions: GuideKitCoreOptions = {\n tokenEndpoint,\n stt,\n tts,\n llm,\n agent,\n contentMap,\n options,\n instanceId,\n rootElement,\n onError,\n onEvent,\n onReady,\n onBeforeLLMCall,\n };\n coreRef.current = new GuideKitCore(coreOptions);\n }\n\n // init() on mount, destroy() on unmount.\n useEffect(() => {\n const core = coreRef.current;\n if (!core) return;\n\n // SSR guard\n if (typeof window === 'undefined') return;\n\n // Prevent double-init in StrictMode. The SingletonGuard in core also\n // protects against this, but this flag avoids the extra async call.\n if (initCalled.current) return;\n initCalled.current = true;\n\n core.init().catch((initErr: unknown) => {\n if (options?.debug) {\n console.error('[GuideKit:React] init() failed', initErr);\n }\n if (initErr && typeof initErr === 'object' && 'message' in initErr) {\n onError?.(initErr as GuideKitErrorType);\n }\n });\n\n return () => {\n initCalled.current = false;\n core.destroy().catch((destroyErr: unknown) => {\n if (options?.debug) {\n console.error('[GuideKit:React] destroy() failed', destroyErr);\n }\n });\n };\n }, []);\n\n return (\n <GuideKitContext.Provider value={coreRef.current}>\n {children}\n <GuideKitWidget theme={theme} consentRequired={options?.consentRequired} instanceId={instanceId} />\n </GuideKitContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Split Hook: useGuideKitStatus\n// ---------------------------------------------------------------------------\n\nexport function useGuideKitStatus(): {\n isReady: boolean;\n agentState: AgentState;\n error: GuideKitErrorType | null;\n} {\n const core = useGuideKitCore();\n\n const subscribe = useCallback(\n (listener: () => void) =>\n core ? core.subscribe(listener) : SSR_SUBSCRIBE(listener),\n [core],\n );\n\n const getSnapshot = useCallback(\n () => (core ? core.getSnapshot().status : SSR_SNAPSHOT.status),\n [core],\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, () => SSR_SNAPSHOT.status);\n}\n\n// ---------------------------------------------------------------------------\n// Split Hook: useGuideKitVoice\n// ---------------------------------------------------------------------------\n\nexport function useGuideKitVoice(): {\n isListening: boolean;\n isSpeaking: boolean;\n startListening: () => void;\n stopListening: () => void;\n sendText: (text: string) => Promise<string>;\n} {\n const core = useGuideKitCore();\n\n const subscribe = useCallback(\n (listener: () => void) =>\n core ? core.subscribe(listener) : SSR_SUBSCRIBE(listener),\n [core],\n );\n\n const getSnapshot = useCallback(\n () => (core ? core.getSnapshot().voice : SSR_SNAPSHOT.voice),\n [core],\n );\n\n const voiceSlice = useSyncExternalStore(\n subscribe,\n getSnapshot,\n () => SSR_SNAPSHOT.voice,\n );\n\n const startListening = useCallback(() => {\n if (core) {\n core.startListening().catch((err) => {\n console.error('[GuideKit] Failed to start listening:', err);\n });\n }\n }, [core]);\n\n const stopListening = useCallback(() => {\n if (core) {\n core.stopListening();\n }\n }, [core]);\n\n const sendText = useCallback(\n (text: string): Promise<string> => {\n if (!core) {\n return Promise.reject(\n new Error('GuideKit not initialised. Wrap your app in <GuideKitProvider>.'),\n );\n }\n return core.sendText(text);\n },\n [core],\n );\n\n return {\n ...voiceSlice,\n startListening,\n stopListening,\n sendText,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Split Hook: useGuideKitActions\n// ---------------------------------------------------------------------------\n\nexport function useGuideKitActions(): {\n highlight: (\n sectionId: string,\n options?: { selector?: string; tooltip?: string; position?: string },\n ) => void;\n dismissHighlight: () => void;\n scrollToSection: (sectionId: string, offset?: number) => void;\n startTour: (sectionIds: string[], mode?: 'auto' | 'manual') => void;\n navigate: (href: string) => void;\n} {\n const core = useGuideKitCore();\n\n const highlight = useCallback(\n (\n sectionId: string,\n options?: { selector?: string; tooltip?: string; position?: string },\n ) => {\n core?.highlight({\n sectionId,\n selector: options?.selector,\n tooltip: options?.tooltip,\n position: options?.position as 'top' | 'bottom' | 'left' | 'right' | 'auto' | undefined,\n });\n },\n [core],\n );\n\n const dismissHighlight = useCallback(() => {\n core?.dismissHighlight();\n }, [core]);\n\n const scrollToSection = useCallback(\n (sectionId: string, offset?: number) => {\n core?.scrollToSection(sectionId, offset);\n },\n [core],\n );\n\n const startTour = useCallback(\n (sectionIds: string[], mode?: 'auto' | 'manual') => {\n core?.startTour(sectionIds, mode);\n },\n [core],\n );\n\n const navigate = useCallback(\n (href: string) => {\n core?.navigate(href).catch((err) => {\n console.error('[GuideKit] Navigation failed:', err);\n });\n },\n [core],\n );\n\n return { highlight, dismissHighlight, scrollToSection, startTour, navigate };\n}\n\n// ---------------------------------------------------------------------------\n// Split Hook: useGuideKitContext\n// ---------------------------------------------------------------------------\n\nexport function useGuideKitContext(): {\n setPageContext: (context: Record<string, unknown>) => void;\n addContext: (key: string, value: unknown) => void;\n registerAction: (\n actionId: string,\n action: {\n description: string;\n parameters: Record<string, unknown>;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n },\n ) => void;\n} {\n const core = useGuideKitCore();\n\n const setPageContext = useCallback(\n (context: Record<string, unknown>) => {\n core?.setPageContext(context);\n },\n [core],\n );\n\n const addContext = useCallback(\n (key: string, value: unknown) => {\n core?.setPageContext({ [key]: value });\n },\n [core],\n );\n\n const registerAction = useCallback(\n (\n actionId: string,\n action: {\n description: string;\n parameters: Record<string, unknown>;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n },\n ) => {\n core?.registerAction(actionId, action);\n },\n [core],\n );\n\n return { setPageContext, addContext, registerAction };\n}\n\n// ---------------------------------------------------------------------------\n// Combined Hook: useGuideKit\n// ---------------------------------------------------------------------------\n\nexport function useGuideKit(): {\n isReady: boolean;\n agentState: AgentState;\n error: GuideKitErrorType | null;\n isListening: boolean;\n isSpeaking: boolean;\n startListening: () => void;\n stopListening: () => void;\n sendText: (text: string) => Promise<string>;\n highlight: (\n sectionId: string,\n options?: { selector?: string; tooltip?: string; position?: string },\n ) => void;\n dismissHighlight: () => void;\n scrollToSection: (sectionId: string, offset?: number) => void;\n startTour: (sectionIds: string[], mode?: 'auto' | 'manual') => void;\n navigate: (href: string) => void;\n setPageContext: (context: Record<string, unknown>) => void;\n addContext: (key: string, value: unknown) => void;\n registerAction: (\n actionId: string,\n action: {\n description: string;\n parameters: Record<string, unknown>;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n },\n ) => void;\n} {\n const status = useGuideKitStatus();\n const voice = useGuideKitVoice();\n const actions = useGuideKitActions();\n const ctx = useGuideKitContext();\n\n return {\n ...status,\n ...voice,\n ...actions,\n ...ctx,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Transcript message type (internal)\n// ---------------------------------------------------------------------------\n\ninterface TranscriptMessage {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// CSS for the widget (injected into Shadow DOM)\n// ---------------------------------------------------------------------------\n\nconst WIDGET_STYLES = /* css */ `\n :host {\n --gk-primary: #6366f1;\n --gk-primary-hover: #4f46e5;\n --gk-primary-active: #4338ca;\n --gk-bg: #ffffff;\n --gk-bg-secondary: #f8fafc;\n --gk-text: #1e293b;\n --gk-text-secondary: #64748b;\n --gk-border: #e2e8f0;\n --gk-shadow: 0 20px 60px rgba(0, 0, 0, 0.15);\n --gk-radius: 16px;\n --gk-fab-size: 56px;\n --gk-panel-width: 380px;\n --gk-panel-height: 520px;\n --gk-font: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n\n all: initial;\n font-family: var(--gk-font);\n position: fixed;\n z-index: 2147483647;\n bottom: 24px;\n right: 24px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n transition-duration: 0.01ms !important;\n }\n }\n\n /* ----- Floating Action Button ----- */\n\n .gk-fab {\n width: var(--gk-fab-size);\n height: var(--gk-fab-size);\n border-radius: 50%;\n border: none;\n background: var(--gk-primary);\n color: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 16px rgba(99, 102, 241, 0.35);\n transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.15s ease;\n outline: none;\n position: relative;\n }\n\n .gk-fab:hover {\n background: var(--gk-primary-hover);\n transform: scale(1.05);\n box-shadow: 0 6px 24px rgba(99, 102, 241, 0.45);\n }\n\n .gk-fab:active {\n background: var(--gk-primary-active);\n transform: scale(0.97);\n }\n\n .gk-fab:focus-visible {\n outline: 2px solid var(--gk-primary);\n outline-offset: 3px;\n }\n\n .gk-fab svg {\n width: 24px;\n height: 24px;\n fill: currentColor;\n transition: transform 0.2s ease;\n }\n\n .gk-fab[aria-expanded=\"true\"] svg {\n transform: rotate(45deg);\n }\n\n /* ----- Panel ----- */\n\n .gk-panel {\n position: absolute;\n bottom: calc(var(--gk-fab-size) + 16px);\n right: 0;\n width: var(--gk-panel-width);\n height: var(--gk-panel-height);\n background: var(--gk-bg);\n border-radius: var(--gk-radius);\n box-shadow: var(--gk-shadow);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n opacity: 0;\n transform: translateY(12px) scale(0.95);\n pointer-events: none;\n transition: opacity 0.2s ease, transform 0.2s ease;\n }\n\n .gk-panel[data-open=\"true\"] {\n opacity: 1;\n transform: translateY(0) scale(1);\n pointer-events: auto;\n }\n\n /* ----- Header ----- */\n\n .gk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--gk-border);\n background: var(--gk-bg);\n flex-shrink: 0;\n }\n\n .gk-header-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--gk-text);\n margin: 0;\n }\n\n .gk-header-status {\n font-size: 12px;\n color: var(--gk-text-secondary);\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .gk-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #94a3b8;\n flex-shrink: 0;\n }\n\n .gk-status-dot[data-ready=\"true\"] {\n background: #22c55e;\n }\n\n .gk-close-btn {\n width: 28px;\n height: 28px;\n border-radius: 8px;\n border: none;\n background: transparent;\n color: var(--gk-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease, color 0.15s ease;\n outline: none;\n flex-shrink: 0;\n }\n\n .gk-close-btn:hover {\n background: var(--gk-bg-secondary);\n color: var(--gk-text);\n }\n\n .gk-close-btn:focus-visible {\n outline: 2px solid var(--gk-primary);\n outline-offset: -2px;\n }\n\n .gk-close-btn svg {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n /* ----- Transcript ----- */\n\n .gk-transcript {\n flex: 1;\n overflow-y: auto;\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n scroll-behavior: smooth;\n }\n\n .gk-transcript::-webkit-scrollbar {\n width: 4px;\n }\n\n .gk-transcript::-webkit-scrollbar-thumb {\n background: var(--gk-border);\n border-radius: 2px;\n }\n\n .gk-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: var(--gk-text-secondary);\n text-align: center;\n padding: 32px 16px;\n }\n\n .gk-empty-state-icon {\n width: 40px;\n height: 40px;\n border-radius: 12px;\n background: var(--gk-bg-secondary);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 4px;\n }\n\n .gk-empty-state-icon svg {\n width: 20px;\n height: 20px;\n fill: var(--gk-text-secondary);\n }\n\n .gk-empty-state p {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n }\n\n /* ----- Message Bubbles ----- */\n\n .gk-message {\n max-width: 85%;\n padding: 10px 14px;\n border-radius: 12px;\n font-size: 14px;\n line-height: 1.5;\n word-wrap: break-word;\n white-space: pre-wrap;\n }\n\n .gk-message[data-role=\"user\"] {\n align-self: flex-end;\n background: var(--gk-primary);\n color: #fff;\n border-bottom-right-radius: 4px;\n }\n\n .gk-message[data-role=\"assistant\"] {\n align-self: flex-start;\n background: var(--gk-bg-secondary);\n color: var(--gk-text);\n border-bottom-left-radius: 4px;\n }\n\n /* ----- Processing indicator ----- */\n\n .gk-processing {\n align-self: flex-start;\n display: flex;\n gap: 4px;\n padding: 12px 16px;\n }\n\n .gk-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--gk-text-secondary);\n animation: gk-bounce 1.4s ease-in-out infinite;\n }\n\n .gk-dot:nth-child(2) { animation-delay: 0.16s; }\n .gk-dot:nth-child(3) { animation-delay: 0.32s; }\n\n @keyframes gk-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-6px); }\n }\n\n /* ----- Input Area ----- */\n\n .gk-input-area {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--gk-border);\n background: var(--gk-bg);\n flex-shrink: 0;\n }\n\n .gk-input {\n flex: 1;\n min-height: 40px;\n max-height: 120px;\n padding: 8px 14px;\n border: 1px solid var(--gk-border);\n border-radius: 12px;\n background: var(--gk-bg);\n color: var(--gk-text);\n font-family: var(--gk-font);\n font-size: 14px;\n line-height: 1.5;\n resize: none;\n outline: none;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n }\n\n .gk-input::placeholder {\n color: var(--gk-text-secondary);\n }\n\n .gk-input:focus {\n border-color: var(--gk-primary);\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n }\n\n .gk-send-btn {\n width: 40px;\n height: 40px;\n border-radius: 12px;\n border: none;\n background: var(--gk-primary);\n color: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background 0.15s ease, transform 0.1s ease;\n outline: none;\n }\n\n .gk-send-btn:hover:not(:disabled) {\n background: var(--gk-primary-hover);\n }\n\n .gk-send-btn:active:not(:disabled) {\n transform: scale(0.93);\n }\n\n .gk-send-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .gk-send-btn:focus-visible {\n outline: 2px solid var(--gk-primary);\n outline-offset: 3px;\n }\n\n .gk-send-btn svg {\n width: 18px;\n height: 18px;\n fill: currentColor;\n }\n\n /* ----- Mic Button ----- */\n\n .gk-mic-btn {\n width: 40px;\n height: 40px;\n border-radius: 12px;\n border: none;\n background: transparent;\n color: var(--gk-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background 0.15s ease, color 0.15s ease, transform 0.1s ease;\n outline: none;\n }\n\n .gk-mic-btn:hover:not(:disabled) {\n background: var(--gk-bg-secondary);\n color: var(--gk-text);\n }\n\n .gk-mic-btn:active:not(:disabled) {\n transform: scale(0.93);\n }\n\n .gk-mic-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .gk-mic-btn:focus-visible {\n outline: 2px solid var(--gk-primary);\n outline-offset: 3px;\n }\n\n .gk-mic-btn svg {\n width: 20px;\n height: 20px;\n fill: currentColor;\n }\n\n .gk-mic-btn[data-active=\"true\"] {\n background: #fee2e2;\n color: #dc2626;\n }\n\n .gk-mic-btn[data-active=\"true\"]:hover {\n background: #fecaca;\n }\n\n /* Pulse animation for active mic */\n @keyframes gk-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 rgba(220, 38, 38, 0.4); }\n 50% { box-shadow: 0 0 0 6px rgba(220, 38, 38, 0); }\n }\n\n .gk-mic-btn[data-active=\"true\"] {\n animation: gk-pulse 1.5s ease-in-out infinite;\n }\n\n /* ----- Voice Degraded Banner ----- */\n\n .gk-voice-notice {\n padding: 6px 16px;\n background: #fffbeb;\n color: #92400e;\n font-size: 12px;\n line-height: 1.4;\n border-top: 1px solid #fde68a;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n /* ----- Error Banner ----- */\n\n .gk-error {\n padding: 8px 16px;\n background: #fef2f2;\n color: #dc2626;\n font-size: 12px;\n line-height: 1.4;\n border-top: 1px solid #fecaca;\n flex-shrink: 0;\n }\n\n /* ----- Mobile Responsive: Bottom Sheet ----- */\n\n @media (hover: none) and (pointer: coarse), (max-width: 768px) {\n :host {\n bottom: 16px !important;\n right: 16px !important;\n left: auto !important;\n }\n\n .gk-panel {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n width: 100%;\n height: 70vh;\n max-height: 70vh;\n border-radius: var(--gk-radius) var(--gk-radius) 0 0;\n transform: translateY(100%);\n padding-bottom: env(safe-area-inset-bottom, 0px);\n }\n\n .gk-panel[data-open=\"true\"] {\n transform: translateY(0);\n }\n\n .gk-fab {\n bottom: 16px;\n right: 16px;\n }\n\n .gk-input-area {\n padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));\n }\n\n /* Touch targets min 44x44 */\n .gk-send-btn,\n .gk-mic-btn,\n .gk-close-btn {\n min-width: 44px;\n min-height: 44px;\n }\n }\n\n /* ----- Privacy Consent Dialog ----- */\n\n .gk-consent-dialog {\n position: absolute;\n bottom: calc(var(--gk-fab-size) + 16px);\n right: 0;\n width: var(--gk-panel-width);\n background: var(--gk-bg);\n border-radius: var(--gk-radius);\n box-shadow: var(--gk-shadow);\n padding: 24px;\n opacity: 0;\n transform: translateY(12px) scale(0.95);\n pointer-events: none;\n transition: opacity 0.2s ease, transform 0.2s ease;\n }\n\n .gk-consent-dialog[data-open=\"true\"] {\n opacity: 1;\n transform: translateY(0) scale(1);\n pointer-events: auto;\n }\n\n .gk-consent-message {\n font-size: 14px;\n line-height: 1.6;\n color: var(--gk-text);\n margin: 0 0 20px 0;\n }\n\n .gk-consent-actions {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n }\n\n .gk-consent-btn {\n padding: 8px 20px;\n border-radius: 10px;\n font-family: var(--gk-font);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease, transform 0.1s ease;\n outline: none;\n border: none;\n }\n\n .gk-consent-btn:focus-visible {\n outline: 2px solid var(--gk-primary);\n outline-offset: 2px;\n }\n\n .gk-consent-btn:active {\n transform: scale(0.97);\n }\n\n .gk-consent-btn--decline {\n background: var(--gk-bg-secondary);\n color: var(--gk-text-secondary);\n border: 1px solid var(--gk-border);\n }\n\n .gk-consent-btn--decline:hover {\n background: var(--gk-border);\n color: var(--gk-text);\n }\n\n .gk-consent-btn--accept {\n background: var(--gk-primary);\n color: #fff;\n }\n\n .gk-consent-btn--accept:hover {\n background: var(--gk-primary-hover);\n }\n\n /* ----- High Contrast (Windows) ----- */\n\n @media (forced-colors: active) {\n .gk-fab,\n .gk-send-btn,\n .gk-mic-btn {\n border: 2px solid ButtonText;\n }\n\n .gk-panel {\n border: 1px solid ButtonText;\n }\n\n .gk-message[data-role=\"user\"] {\n border: 1px solid Highlight;\n }\n\n .gk-message[data-role=\"assistant\"] {\n border: 1px solid ButtonText;\n }\n\n .gk-consent-dialog {\n border: 1px solid ButtonText;\n }\n\n .gk-consent-btn {\n border: 2px solid ButtonText;\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// SVG icons (inline, no external deps)\n// ---------------------------------------------------------------------------\n\nconst ChatIcon = () => (\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\" />\n <path d=\"M7 9h10v2H7zm0-3h10v2H7z\" />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\nconst SendIcon = () => (\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n);\n\nconst MicIcon = () => (\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\" />\n </svg>\n);\n\nconst MicOffIcon = () => (\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M19 11h-1.7c0 .74-.16 1.43-.43 2.05l1.23 1.23c.56-.98.9-2.09.9-3.28zm-4.02.17c0-.06.02-.11.02-.17V5c0-1.66-1.34-3-3-3S9 3.34 9 5v.18l5.98 5.99zM4.27 3L3 4.27l6.01 6.01V11c0 1.66 1.33 3 2.99 3 .22 0 .44-.03.65-.08l1.66 1.66c-.71.33-1.5.52-2.31.52-2.76 0-5.3-2.1-5.3-5.1H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c.91-.13 1.77-.45 2.54-.9L19.73 21 21 19.73 4.27 3z\" />\n </svg>\n);\n\nconst SparkleIcon = () => (\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12 2L9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2z\" />\n </svg>\n);\n\n// ---------------------------------------------------------------------------\n// GuideKitWidget (internal) — Shadow DOM isolated chat widget\n// ---------------------------------------------------------------------------\n\ninterface WidgetProps {\n theme?: {\n primaryColor?: string;\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n borderRadius?: string;\n };\n consentRequired?: boolean;\n instanceId?: string;\n}\n\nfunction GuideKitWidget({ theme, consentRequired, instanceId }: WidgetProps) {\n const core = useGuideKitCore();\n const { isReady, agentState } = useGuideKitStatus();\n\n const [isOpen, setIsOpen] = useState(false);\n const [messages, setMessages] = useState<TranscriptMessage[]>([]);\n const [inputValue, setInputValue] = useState('');\n const [isSending, setIsSending] = useState(false);\n const [isVoiceActive, setIsVoiceActive] = useState(false);\n\n // ---- Privacy consent state ----\n\n const consentStorageKey = `guidekit-consent:${instanceId ?? 'default'}`;\n\n const [hasConsent, setHasConsent] = useState<boolean>(() => {\n if (!consentRequired) return true;\n if (typeof window === 'undefined') return false;\n try {\n return localStorage.getItem(consentStorageKey) === 'granted';\n } catch {\n return false;\n }\n });\n\n const [showConsentDialog, setShowConsentDialog] = useState(false);\n\n const shadowHostRef = useRef<HTMLDivElement | null>(null);\n const shadowRootRef = useRef<ShadowRoot | null>(null);\n const shadowContainerRef = useRef<HTMLDivElement | null>(null);\n const transcriptRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLTextAreaElement | null>(null);\n const fabRef = useRef<HTMLButtonElement | null>(null);\n\n // Monotonic ID counter for messages\n const msgIdRef = useRef(0);\n\n // i18n helper — get localized string from core\n const t = useCallback(\n (key: string): string => {\n if (core) {\n return (core.i18n as any).t(key) ?? key;\n }\n return key;\n },\n [core],\n );\n\n // Track whether Shadow DOM has been initialised\n const [shadowReady, setShadowReady] = useState(false);\n\n // ---- Create Shadow DOM on mount ----\n\n useEffect(() => {\n const host = shadowHostRef.current;\n if (!host || shadowRootRef.current) return;\n\n const shadow = host.attachShadow({ mode: 'open' });\n shadowRootRef.current = shadow;\n\n // Inject styles\n const styleEl = document.createElement('style');\n styleEl.textContent = WIDGET_STYLES;\n shadow.appendChild(styleEl);\n\n // Create a container div for React to portal into (we render imperatively)\n const container = document.createElement('div');\n shadow.appendChild(container);\n shadowContainerRef.current = container;\n setShadowReady(true);\n\n return () => {\n shadowRootRef.current = null;\n shadowContainerRef.current = null;\n setShadowReady(false);\n };\n }, []);\n\n // ---- Apply theme CSS custom properties ----\n\n useEffect(() => {\n const container = shadowContainerRef.current;\n if (!container) return;\n const host = shadowHostRef.current;\n if (!host) return;\n\n if (theme?.primaryColor) {\n host.style.setProperty('--gk-primary', theme.primaryColor);\n }\n if (theme?.borderRadius) {\n host.style.setProperty('--gk-radius', theme.borderRadius);\n }\n\n // Position\n const pos = theme?.position ?? 'bottom-right';\n host.style.removeProperty('top');\n host.style.removeProperty('bottom');\n host.style.removeProperty('left');\n host.style.removeProperty('right');\n\n switch (pos) {\n case 'bottom-right':\n host.style.bottom = '24px';\n host.style.right = '24px';\n break;\n case 'bottom-left':\n host.style.bottom = '24px';\n host.style.left = '24px';\n break;\n case 'top-right':\n host.style.top = '24px';\n host.style.right = '24px';\n break;\n case 'top-left':\n host.style.top = '24px';\n host.style.left = '24px';\n break;\n }\n }, [theme, shadowReady]);\n\n // ---- Auto-scroll transcript ----\n\n useEffect(() => {\n const el = transcriptRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, [messages, isSending]);\n\n // ---- Focus input when panel opens ----\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n // Small delay to let the panel animate in\n const timer = setTimeout(() => inputRef.current?.focus(), 100);\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n // ---- Send message handler ----\n\n const handleSend = useCallback(async () => {\n const text = inputValue.trim();\n if (!text || !core || isSending) return;\n\n const userMsg: TranscriptMessage = {\n id: `msg-${++msgIdRef.current}`,\n role: 'user',\n content: text,\n timestamp: Date.now(),\n };\n\n setMessages((prev) => [...prev, userMsg]);\n setInputValue('');\n setIsSending(true);\n\n try {\n const response = await core.sendText(text);\n const assistantMsg: TranscriptMessage = {\n id: `msg-${++msgIdRef.current}`,\n role: 'assistant',\n content: response,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, assistantMsg]);\n } catch (err) {\n const errorContent =\n err instanceof Error ? err.message : 'Something went wrong. Please try again.';\n const errorMsg: TranscriptMessage = {\n id: `msg-${++msgIdRef.current}`,\n role: 'assistant',\n content: `Error: ${errorContent}`,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, errorMsg]);\n } finally {\n setIsSending(false);\n }\n }, [inputValue, core, isSending]);\n\n // ---- Mic toggle handler ----\n\n const handleMicToggle = useCallback(async () => {\n if (!core) return;\n\n if (isVoiceActive) {\n core.stopListening();\n setIsVoiceActive(false);\n } else {\n try {\n await core.startListening();\n setIsVoiceActive(true);\n } catch (err) {\n console.error('[GuideKit] Failed to start voice:', err);\n setIsVoiceActive(false);\n }\n }\n }, [core, isVoiceActive]);\n\n // ---- Keyboard handlers ----\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n if (e.key === 'Escape') {\n setIsOpen(false);\n // Return focus to FAB\n fabRef.current?.focus();\n }\n },\n [handleSend],\n );\n\n const handlePanelKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n fabRef.current?.focus();\n }\n },\n [],\n );\n\n // ---- Consent handlers ----\n\n const handleConsentAccept = useCallback(() => {\n try {\n localStorage.setItem(consentStorageKey, 'granted');\n } catch {\n // localStorage may be unavailable (e.g. private browsing quota)\n }\n setHasConsent(true);\n setShowConsentDialog(false);\n setIsOpen(true);\n }, [consentStorageKey]);\n\n const handleConsentDecline = useCallback(() => {\n setShowConsentDialog(false);\n fabRef.current?.focus();\n }, []);\n\n const handleConsentKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n setShowConsentDialog(false);\n fabRef.current?.focus();\n }\n },\n [],\n );\n\n // ---- Toggle panel ----\n\n const togglePanel = useCallback(() => {\n if (consentRequired && !hasConsent) {\n // First click: show consent dialog instead of opening the panel\n setShowConsentDialog((prev) => !prev);\n return;\n }\n setIsOpen((prev) => !prev);\n }, [consentRequired, hasConsent]);\n\n // ---- Determine processing state ----\n\n const isProcessing = agentState.status === 'processing';\n const hasVoice = core?.hasVoice ?? false;\n const isListeningState = agentState.status === 'listening';\n const isSpeakingState = agentState.status === 'speaking';\n\n // Sync voice active state with agent state\n useEffect(() => {\n if (!isListeningState && isVoiceActive) {\n // Voice state changed externally (e.g. barge-in ended listening)\n // Don't clear if speaking - that's expected in half-duplex\n if (!isSpeakingState && !isProcessing) {\n setIsVoiceActive(false);\n }\n }\n }, [isListeningState, isSpeakingState, isProcessing, isVoiceActive]);\n\n // ---- Derive status label ----\n\n const statusLabel = isReady\n ? isListeningState\n ? t('statusListening')\n : isSpeakingState\n ? t('statusSpeaking')\n : t('statusOnline')\n : t('statusConnecting');\n\n // ---- Render into Shadow DOM imperatively via portal ----\n\n // We cannot use ReactDOM.createPortal into a shadow root container directly\n // in all React versions. Instead we render the widget tree *outside* the\n // Shadow DOM host element and use an effect to clone/sync it in. However,\n // the simplest cross-version approach is to render the UI in the normal\n // React tree and use the shadow host purely for style encapsulation.\n //\n // For maximum compatibility we render our widget markup below and portal\n // it into the shadow container using ReactDOM.createPortal when shadow is\n // ready.\n\n // We need dynamic import of createPortal to avoid SSR issues.\n const createPortalRef = useRef<typeof import('react-dom').createPortal | null>(null);\n const [portalReady, setPortalReady] = useState(false);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n import('react-dom').then((mod) => {\n createPortalRef.current = mod.createPortal;\n setPortalReady(true);\n });\n }, []);\n\n // ---- Widget UI tree ----\n\n const widgetUI = (\n <>\n {/* Panel */}\n <div\n className=\"gk-panel\"\n data-open={isOpen ? 'true' : 'false'}\n role=\"dialog\"\n aria-label={t('widgetTitle')}\n aria-hidden={!isOpen}\n onKeyDown={handlePanelKeyDown}\n >\n {/* Header */}\n <div className=\"gk-header\">\n <div>\n <div className=\"gk-header-title\">{t('widgetTitle')}</div>\n <div className=\"gk-header-status\">\n <span className=\"gk-status-dot\" data-ready={isReady ? 'true' : 'false'} />\n <span>{statusLabel}</span>\n </div>\n </div>\n <button\n className=\"gk-close-btn\"\n onClick={() => {\n setIsOpen(false);\n fabRef.current?.focus();\n }}\n aria-label={t('closePanel')}\n tabIndex={isOpen ? 0 : -1}\n >\n <CloseIcon />\n </button>\n </div>\n\n {/* Transcript */}\n <div\n className=\"gk-transcript\"\n ref={transcriptRef}\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Conversation transcript\"\n >\n {messages.length === 0 && !isSending ? (\n <div className=\"gk-empty-state\">\n <div className=\"gk-empty-state-icon\">\n <SparkleIcon />\n </div>\n <p>{t('emptyStateMessage')}</p>\n </div>\n ) : (\n <>\n {messages.map((msg) => (\n <div\n key={msg.id}\n className=\"gk-message\"\n data-role={msg.role}\n role={msg.role === 'assistant' ? 'status' : undefined}\n >\n {msg.content}\n </div>\n ))}\n {isProcessing && (\n <div className=\"gk-processing\" role=\"status\" aria-label=\"Processing\">\n <div className=\"gk-dot\" />\n <div className=\"gk-dot\" />\n <div className=\"gk-dot\" />\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Error banner */}\n {agentState.status === 'error' && (\n <div className=\"gk-error\" role=\"alert\">\n {agentState.error?.message ?? 'An error occurred.'}\n </div>\n )}\n\n {/* Input area */}\n <div className=\"gk-input-area\">\n {hasVoice && (\n <button\n className=\"gk-mic-btn\"\n onClick={handleMicToggle}\n disabled={!isReady || isSending}\n data-active={isVoiceActive || isListeningState ? 'true' : 'false'}\n aria-label={isVoiceActive ? t('stopVoice') : t('startVoice')}\n tabIndex={isOpen ? 0 : -1}\n >\n {isVoiceActive || isListeningState ? <MicOffIcon /> : <MicIcon />}\n </button>\n )}\n <textarea\n className=\"gk-input\"\n ref={inputRef}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={isListeningState ? t('listeningPlaceholder') : t('inputPlaceholder')}\n aria-label={t('sendMessage')}\n rows={1}\n disabled={!isReady || isSending}\n tabIndex={isOpen ? 0 : -1}\n />\n <button\n className=\"gk-send-btn\"\n onClick={handleSend}\n disabled={!isReady || isSending || !inputValue.trim()}\n aria-label={t('sendMessage')}\n tabIndex={isOpen ? 0 : -1}\n >\n <SendIcon />\n </button>\n </div>\n </div>\n\n {/* Privacy Consent Dialog */}\n {consentRequired && !hasConsent && (\n <div\n className=\"gk-consent-dialog\"\n data-open={showConsentDialog ? 'true' : 'false'}\n role=\"dialog\"\n aria-label=\"Privacy consent\"\n aria-hidden={!showConsentDialog}\n onKeyDown={handleConsentKeyDown}\n >\n <p className=\"gk-consent-message\">\n This assistant uses AI to help you navigate this site. Your questions will be processed by an AI service.\n </p>\n <div className=\"gk-consent-actions\">\n <button\n className=\"gk-consent-btn gk-consent-btn--decline\"\n onClick={handleConsentDecline}\n tabIndex={showConsentDialog ? 0 : -1}\n >\n Decline\n </button>\n <button\n className=\"gk-consent-btn gk-consent-btn--accept\"\n onClick={handleConsentAccept}\n tabIndex={showConsentDialog ? 0 : -1}\n >\n Accept\n </button>\n </div>\n </div>\n )}\n\n {/* FAB */}\n <button\n className=\"gk-fab\"\n ref={fabRef}\n onClick={togglePanel}\n aria-label={isOpen ? t('closeAssistant') : t('openAssistant')}\n aria-expanded={isOpen || showConsentDialog}\n aria-haspopup=\"dialog\"\n >\n {isOpen ? <CloseIcon /> : <ChatIcon />}\n </button>\n </>\n );\n\n // ---- SSR guard: render nothing on the server ----\n\n if (typeof window === 'undefined') {\n return null;\n }\n\n return (\n <div\n ref={shadowHostRef}\n id=\"guidekit-widget\"\n style={{\n // The host element itself is positioned via :host in Shadow DOM CSS,\n // but we also set fixed positioning here as a fallback.\n position: 'fixed',\n zIndex: 2147483647,\n bottom: '24px',\n right: '24px',\n // Ensure the host doesn't interfere with page layout\n margin: 0,\n padding: 0,\n border: 'none',\n background: 'none',\n }}\n >\n {shadowReady && portalReady && shadowContainerRef.current && createPortalRef.current\n ? createPortalRef.current(widgetUI, shadowContainerRef.current)\n : null}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports for convenience\n// ---------------------------------------------------------------------------\n\nexport type {\n GuideKitCoreOptions,\n GuideKitProviderProps,\n AgentState,\n GuideKitStore,\n GuideKitErrorType,\n GuideKitEvent,\n};\n"]}
@@ -0,0 +1,196 @@
1
+ 'use strict';
2
+
3
+ var chunkEQGJ2LTR_cjs = require('./chunk-EQGJ2LTR.cjs');
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ var DEFAULT_STORE = {
8
+ status: {
9
+ isReady: false,
10
+ agentState: { status: "idle" },
11
+ error: null
12
+ }};
13
+ var TestStore = class {
14
+ listeners = /* @__PURE__ */ new Set();
15
+ _state;
16
+ constructor(initial) {
17
+ this._state = {
18
+ status: {
19
+ isReady: initial?.isReady ?? DEFAULT_STORE.status.isReady,
20
+ agentState: initial?.agentState ?? DEFAULT_STORE.status.agentState,
21
+ error: initial?.error ?? DEFAULT_STORE.status.error
22
+ },
23
+ voice: {
24
+ isListening: false,
25
+ isSpeaking: false
26
+ }
27
+ };
28
+ }
29
+ subscribe = (listener) => {
30
+ this.listeners.add(listener);
31
+ return () => {
32
+ this.listeners.delete(listener);
33
+ };
34
+ };
35
+ getSnapshot = () => {
36
+ return this._state;
37
+ };
38
+ setState(updater) {
39
+ const next = updater(this._state);
40
+ if (next !== this._state) {
41
+ this._state = next;
42
+ this.emitChange();
43
+ }
44
+ }
45
+ /** Replace the state entirely. */
46
+ setStateDirectly(next) {
47
+ if (next !== this._state) {
48
+ this._state = next;
49
+ this.emitChange();
50
+ }
51
+ }
52
+ emitChange() {
53
+ for (const listener of this.listeners) {
54
+ listener();
55
+ }
56
+ }
57
+ };
58
+ var _testStore = null;
59
+ function requireTestStore() {
60
+ if (!_testStore) {
61
+ throw new Error(
62
+ "[GuideKit Testing] No MockGuideKitProvider is mounted. Wrap your component in <MockGuideKitProvider> before calling simulate* functions."
63
+ );
64
+ }
65
+ return _testStore;
66
+ }
67
+ var noopVoid = () => {
68
+ };
69
+ var noopAsync = () => Promise.resolve();
70
+ var noopAsyncString = () => Promise.resolve("");
71
+ var noopAsyncBool = () => Promise.resolve(true);
72
+ function MockGuideKitProvider({
73
+ initialState,
74
+ actions,
75
+ children
76
+ }) {
77
+ const storeRef = react.useRef(null);
78
+ if (storeRef.current === null) {
79
+ storeRef.current = new TestStore(initialState);
80
+ }
81
+ _testStore = storeRef.current;
82
+ const store = storeRef.current;
83
+ const mockCoreRef = react.useRef(null);
84
+ if (mockCoreRef.current === null) {
85
+ mockCoreRef.current = {
86
+ // Store protocol (useSyncExternalStore)
87
+ subscribe: store.subscribe,
88
+ getSnapshot: store.getSnapshot,
89
+ // Actions
90
+ sendText: actions?.sendText ?? noopAsyncString,
91
+ highlight: actions?.highlight ?? noopVoid,
92
+ dismissHighlight: actions?.dismissHighlight ?? noopVoid,
93
+ scrollToSection: actions?.scrollToSection ?? noopVoid,
94
+ startTour: actions?.startTour ?? noopVoid,
95
+ navigate: actions?.navigate ?? noopAsyncBool,
96
+ setPageContext: actions?.setPageContext ?? noopVoid,
97
+ registerAction: actions?.registerAction ?? noopVoid,
98
+ startListening: actions?.startListening ?? noopAsync,
99
+ stopListening: actions?.stopListening ?? noopVoid,
100
+ // Read-only properties
101
+ hasVoice: false,
102
+ instanceId: "mock-test-instance",
103
+ isReady: initialState?.isReady ?? false,
104
+ agentState: initialState?.agentState ?? { status: "idle" },
105
+ // i18n stub (used by the widget internals)
106
+ i18n: { t: (key) => key },
107
+ // Lifecycle stubs
108
+ init: noopAsync,
109
+ destroy: noopAsync
110
+ };
111
+ }
112
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkEQGJ2LTR_cjs.GuideKitContext.Provider, { value: mockCoreRef.current, children });
113
+ }
114
+ function simulateAgentResponse(text) {
115
+ const store = requireTestStore();
116
+ store.setState((prev) => ({
117
+ ...prev,
118
+ status: {
119
+ ...prev.status,
120
+ agentState: { status: "speaking", utterance: text }
121
+ }
122
+ }));
123
+ }
124
+ function simulateVoiceInput(text) {
125
+ const store = requireTestStore();
126
+ store.setState((prev) => ({
127
+ ...prev,
128
+ status: {
129
+ ...prev.status,
130
+ agentState: { status: "processing", transcript: text }
131
+ },
132
+ voice: {
133
+ ...prev.voice,
134
+ isListening: false
135
+ }
136
+ }));
137
+ }
138
+ function simulateError(error) {
139
+ const store = requireTestStore();
140
+ store.setState((prev) => ({
141
+ ...prev,
142
+ status: {
143
+ ...prev.status,
144
+ agentState: { status: "error", error },
145
+ error
146
+ }
147
+ }));
148
+ }
149
+ function getGuideKitTestState() {
150
+ const store = requireTestStore();
151
+ return store.getSnapshot();
152
+ }
153
+ function resetAgentState() {
154
+ const store = requireTestStore();
155
+ store.setState((prev) => ({
156
+ ...prev,
157
+ status: {
158
+ ...prev.status,
159
+ agentState: { status: "idle" },
160
+ error: null
161
+ },
162
+ voice: {
163
+ isListening: false,
164
+ isSpeaking: false
165
+ }
166
+ }));
167
+ }
168
+ function simulateReady(isReady = true) {
169
+ const store = requireTestStore();
170
+ store.setState((prev) => ({
171
+ ...prev,
172
+ status: {
173
+ ...prev.status,
174
+ isReady
175
+ }
176
+ }));
177
+ }
178
+ function getTestStore_UNSAFE() {
179
+ return _testStore;
180
+ }
181
+ function cleanupTestStore() {
182
+ _testStore = null;
183
+ }
184
+
185
+ exports.MockGuideKitProvider = MockGuideKitProvider;
186
+ exports.TestStore = TestStore;
187
+ exports.cleanupTestStore = cleanupTestStore;
188
+ exports.getGuideKitTestState = getGuideKitTestState;
189
+ exports.getTestStore_UNSAFE = getTestStore_UNSAFE;
190
+ exports.resetAgentState = resetAgentState;
191
+ exports.simulateAgentResponse = simulateAgentResponse;
192
+ exports.simulateError = simulateError;
193
+ exports.simulateReady = simulateReady;
194
+ exports.simulateVoiceInput = simulateVoiceInput;
195
+ //# sourceMappingURL=testing.cjs.map
196
+ //# sourceMappingURL=testing.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testing.tsx"],"names":["useRef","GuideKitContext"],"mappings":"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","file":"testing.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// @guidekit/react/testing — Testing utilities for apps using GuideKit\n// ---------------------------------------------------------------------------\n//\n// Provides MockGuideKitProvider and simulate* helpers so consumers can test\n// components that depend on GuideKit hooks without spinning up a real\n// GuideKitCore instance.\n//\n// Usage:\n// import { MockGuideKitProvider, simulateAgentResponse } from '@guidekit/react/testing';\n//\n// render(\n// <MockGuideKitProvider initialState={{ isReady: true }}>\n// <MyComponent />\n// </MockGuideKitProvider>\n// );\n//\n// simulateAgentResponse('Hello from the agent!');\n// ---------------------------------------------------------------------------\n\nimport { useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport type { AgentState, GuideKitStore, GuideKitErrorType } from '@guidekit/core';\n\nimport { GuideKitContext } from './_context.js';\n\n// ---------------------------------------------------------------------------\n// Default store snapshot\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STORE: GuideKitStore = {\n status: {\n isReady: false,\n agentState: { status: 'idle' },\n error: null,\n },\n voice: {\n isListening: false,\n isSpeaking: false,\n },\n};\n\n// ---------------------------------------------------------------------------\n// TestStore — a minimal external store compatible with useSyncExternalStore\n// ---------------------------------------------------------------------------\n\n/** @internal */\nexport class TestStore {\n private listeners = new Set<() => void>();\n private _state: GuideKitStore;\n\n constructor(initial?: Partial<GuideKitStore['status']>) {\n this._state = {\n status: {\n isReady: initial?.isReady ?? DEFAULT_STORE.status.isReady,\n agentState: initial?.agentState ?? DEFAULT_STORE.status.agentState,\n error: initial?.error ?? DEFAULT_STORE.status.error,\n },\n voice: {\n isListening: false,\n isSpeaking: false,\n },\n };\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n getSnapshot = (): GuideKitStore => {\n return this._state;\n };\n\n setState(updater: (prev: GuideKitStore) => GuideKitStore): void {\n const next = updater(this._state);\n if (next !== this._state) {\n this._state = next;\n this.emitChange();\n }\n }\n\n /** Replace the state entirely. */\n setStateDirectly(next: GuideKitStore): void {\n if (next !== this._state) {\n this._state = next;\n this.emitChange();\n }\n }\n\n private emitChange(): void {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Global test store — shared across simulate* functions\n// ---------------------------------------------------------------------------\n\nlet _testStore: TestStore | null = null;\n\nfunction requireTestStore(): TestStore {\n if (!_testStore) {\n throw new Error(\n '[GuideKit Testing] No MockGuideKitProvider is mounted. ' +\n 'Wrap your component in <MockGuideKitProvider> before calling simulate* functions.',\n );\n }\n return _testStore;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Initial state for the mock provider. */\nexport interface MockInitialState {\n isReady?: boolean;\n agentState?: AgentState;\n error?: GuideKitErrorType | null;\n}\n\n/** Mock action implementations to inject into the provider. */\nexport interface MockActions {\n sendText?: (text: string) => Promise<string>;\n highlight?: (params: {\n sectionId?: string;\n selector?: string;\n tooltip?: string;\n position?: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n }) => void;\n dismissHighlight?: () => void;\n scrollToSection?: (sectionId: string, offset?: number) => void;\n startTour?: (sectionIds: string[], mode?: 'auto' | 'manual') => void;\n navigate?: (href: string) => Promise<boolean>;\n setPageContext?: (context: Record<string, unknown>) => void;\n registerAction?: (\n actionId: string,\n action: {\n description: string;\n parameters: Record<string, unknown>;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n },\n ) => void;\n startListening?: () => Promise<void>;\n stopListening?: () => void;\n}\n\n/** Props for MockGuideKitProvider. */\nexport interface MockGuideKitProviderProps {\n initialState?: MockInitialState;\n actions?: MockActions;\n children: ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Noop stubs\n// ---------------------------------------------------------------------------\n\nconst noopVoid = () => {};\nconst noopAsync = () => Promise.resolve();\nconst noopAsyncString = () => Promise.resolve('');\nconst noopAsyncBool = () => Promise.resolve(true);\n\n// ---------------------------------------------------------------------------\n// MockGuideKitProvider\n// ---------------------------------------------------------------------------\n\n/**\n * A mock provider for testing components that use GuideKit hooks.\n *\n * Instead of creating a real GuideKitCore instance (which requires API keys,\n * browser APIs, etc.), this provider supplies a lightweight mock object that\n * satisfies the context contract used by all hooks in `@guidekit/react`.\n *\n * All actions default to noops but can be overridden with mock functions\n * (e.g. `vi.fn()`).\n *\n * The provider injects the mock into the same `GuideKitContext` that the\n * real hooks read from (imported from `./_context.js`), so hooks like\n * `useGuideKitStatus`, `useGuideKitVoice`, etc. work seamlessly.\n *\n * @example\n * ```tsx\n * import { MockGuideKitProvider } from '@guidekit/react/testing';\n *\n * render(\n * <MockGuideKitProvider\n * initialState={{ isReady: true, agentState: { status: 'idle' } }}\n * actions={{ sendText: vi.fn() }}\n * >\n * <ComponentUnderTest />\n * </MockGuideKitProvider>\n * );\n * ```\n */\nexport function MockGuideKitProvider({\n initialState,\n actions,\n children,\n}: MockGuideKitProviderProps) {\n // Create a TestStore on first render, keep it stable across re-renders.\n const storeRef = useRef<TestStore | null>(null);\n if (storeRef.current === null) {\n storeRef.current = new TestStore(initialState);\n }\n\n // Register as the global test store so simulate* functions can find it.\n _testStore = storeRef.current;\n\n const store = storeRef.current;\n\n // Build the mock object that duck-types as GuideKitCore.\n // Kept stable via a ref so the context value identity does not change.\n const mockCoreRef = useRef<Record<string, unknown> | null>(null);\n if (mockCoreRef.current === null) {\n mockCoreRef.current = {\n // Store protocol (useSyncExternalStore)\n subscribe: store.subscribe,\n getSnapshot: store.getSnapshot,\n\n // Actions\n sendText: actions?.sendText ?? noopAsyncString,\n highlight: actions?.highlight ?? noopVoid,\n dismissHighlight: actions?.dismissHighlight ?? noopVoid,\n scrollToSection: actions?.scrollToSection ?? noopVoid,\n startTour: actions?.startTour ?? noopVoid,\n navigate: actions?.navigate ?? noopAsyncBool,\n setPageContext: actions?.setPageContext ?? noopVoid,\n registerAction: actions?.registerAction ?? noopVoid,\n startListening: actions?.startListening ?? noopAsync,\n stopListening: actions?.stopListening ?? noopVoid,\n\n // Read-only properties\n hasVoice: false,\n instanceId: 'mock-test-instance',\n isReady: initialState?.isReady ?? false,\n agentState: initialState?.agentState ?? { status: 'idle' as const },\n\n // i18n stub (used by the widget internals)\n i18n: { t: (key: string) => key },\n\n // Lifecycle stubs\n init: noopAsync,\n destroy: noopAsync,\n };\n }\n\n // Provide the mock into the same GuideKitContext that the real hooks\n // consume, so useGuideKitStatus, useGuideKitVoice, etc. all work.\n return (\n <GuideKitContext.Provider value={mockCoreRef.current as any}>\n {children}\n </GuideKitContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// simulate* functions — update the global test store\n// ---------------------------------------------------------------------------\n\n/**\n * Simulates an assistant response being added to the agent state.\n * Sets the agent state to `{ status: 'speaking', utterance: text }`.\n *\n * Subscribers (e.g. hooks using `useSyncExternalStore`) are notified\n * synchronously, so assertions can run immediately after this call.\n */\nexport function simulateAgentResponse(text: string): void {\n const store = requireTestStore();\n\n store.setState((prev) => ({\n ...prev,\n status: {\n ...prev.status,\n agentState: { status: 'speaking', utterance: text } as AgentState,\n },\n }));\n}\n\n/**\n * Simulates a voice transcript arriving (as if the user spoke).\n * Sets the agent state to `{ status: 'processing', transcript: text }`\n * and marks `voice.isListening` as `false`.\n */\nexport function simulateVoiceInput(text: string): void {\n const store = requireTestStore();\n\n store.setState((prev) => ({\n ...prev,\n status: {\n ...prev.status,\n agentState: { status: 'processing', transcript: text } as AgentState,\n },\n voice: {\n ...prev.voice,\n isListening: false,\n },\n }));\n}\n\n/**\n * Simulates an error occurring in the agent.\n * Sets the agent state to `{ status: 'error', error }` and populates\n * the store-level `error` field.\n */\nexport function simulateError(error: GuideKitErrorType): void {\n const store = requireTestStore();\n\n store.setState((prev) => ({\n ...prev,\n status: {\n ...prev.status,\n agentState: { status: 'error', error } as AgentState,\n error,\n },\n }));\n}\n\n/**\n * Returns the current mock store state. Useful for assertions in tests.\n *\n * @example\n * ```ts\n * const state = getGuideKitTestState();\n * expect(state.status.isReady).toBe(true);\n * ```\n */\nexport function getGuideKitTestState(): GuideKitStore {\n const store = requireTestStore();\n return store.getSnapshot();\n}\n\n// ---------------------------------------------------------------------------\n// Additional helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resets the agent state back to idle and clears any error.\n * Useful for cleaning up between simulate* calls in a test.\n */\nexport function resetAgentState(): void {\n const store = requireTestStore();\n\n store.setState((prev) => ({\n ...prev,\n status: {\n ...prev.status,\n agentState: { status: 'idle' } as AgentState,\n error: null,\n },\n voice: {\n isListening: false,\n isSpeaking: false,\n },\n }));\n}\n\n/**\n * Sets the `isReady` flag on the mock store. Useful to simulate the SDK\n * finishing initialization.\n */\nexport function simulateReady(isReady: boolean = true): void {\n const store = requireTestStore();\n\n store.setState((prev) => ({\n ...prev,\n status: {\n ...prev.status,\n isReady,\n },\n }));\n}\n\n/**\n * Returns the raw TestStore instance for advanced use cases (e.g.,\n * subscribing to changes directly or calling `setState` with a custom\n * updater). Returns `null` if no MockGuideKitProvider is mounted.\n */\nexport function getTestStore_UNSAFE(): TestStore | null {\n return _testStore;\n}\n\n/**\n * Cleans up the global test store reference. Call this in `afterEach` or\n * `afterAll` to prevent state leaking between tests.\n */\nexport function cleanupTestStore(): void {\n _testStore = null;\n}\n\n// ---------------------------------------------------------------------------\n// Re-export types for convenience\n// ---------------------------------------------------------------------------\n\nexport type { AgentState, GuideKitStore, GuideKitErrorType };\n"]}
@@ -0,0 +1,133 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { AgentState, GuideKitErrorType, GuideKitStore } from '@guidekit/core';
4
+ export { AgentState, GuideKitErrorType, GuideKitStore } from '@guidekit/core';
5
+
6
+ /** @internal */
7
+ declare class TestStore {
8
+ private listeners;
9
+ private _state;
10
+ constructor(initial?: Partial<GuideKitStore['status']>);
11
+ subscribe: (listener: () => void) => (() => void);
12
+ getSnapshot: () => GuideKitStore;
13
+ setState(updater: (prev: GuideKitStore) => GuideKitStore): void;
14
+ /** Replace the state entirely. */
15
+ setStateDirectly(next: GuideKitStore): void;
16
+ private emitChange;
17
+ }
18
+ /** Initial state for the mock provider. */
19
+ interface MockInitialState {
20
+ isReady?: boolean;
21
+ agentState?: AgentState;
22
+ error?: GuideKitErrorType | null;
23
+ }
24
+ /** Mock action implementations to inject into the provider. */
25
+ interface MockActions {
26
+ sendText?: (text: string) => Promise<string>;
27
+ highlight?: (params: {
28
+ sectionId?: string;
29
+ selector?: string;
30
+ tooltip?: string;
31
+ position?: 'top' | 'bottom' | 'left' | 'right' | 'auto';
32
+ }) => void;
33
+ dismissHighlight?: () => void;
34
+ scrollToSection?: (sectionId: string, offset?: number) => void;
35
+ startTour?: (sectionIds: string[], mode?: 'auto' | 'manual') => void;
36
+ navigate?: (href: string) => Promise<boolean>;
37
+ setPageContext?: (context: Record<string, unknown>) => void;
38
+ registerAction?: (actionId: string, action: {
39
+ description: string;
40
+ parameters: Record<string, unknown>;
41
+ handler: (params: Record<string, unknown>) => Promise<unknown>;
42
+ }) => void;
43
+ startListening?: () => Promise<void>;
44
+ stopListening?: () => void;
45
+ }
46
+ /** Props for MockGuideKitProvider. */
47
+ interface MockGuideKitProviderProps {
48
+ initialState?: MockInitialState;
49
+ actions?: MockActions;
50
+ children: ReactNode;
51
+ }
52
+ /**
53
+ * A mock provider for testing components that use GuideKit hooks.
54
+ *
55
+ * Instead of creating a real GuideKitCore instance (which requires API keys,
56
+ * browser APIs, etc.), this provider supplies a lightweight mock object that
57
+ * satisfies the context contract used by all hooks in `@guidekit/react`.
58
+ *
59
+ * All actions default to noops but can be overridden with mock functions
60
+ * (e.g. `vi.fn()`).
61
+ *
62
+ * The provider injects the mock into the same `GuideKitContext` that the
63
+ * real hooks read from (imported from `./_context.js`), so hooks like
64
+ * `useGuideKitStatus`, `useGuideKitVoice`, etc. work seamlessly.
65
+ *
66
+ * @example
67
+ * ```tsx
68
+ * import { MockGuideKitProvider } from '@guidekit/react/testing';
69
+ *
70
+ * render(
71
+ * <MockGuideKitProvider
72
+ * initialState={{ isReady: true, agentState: { status: 'idle' } }}
73
+ * actions={{ sendText: vi.fn() }}
74
+ * >
75
+ * <ComponentUnderTest />
76
+ * </MockGuideKitProvider>
77
+ * );
78
+ * ```
79
+ */
80
+ declare function MockGuideKitProvider({ initialState, actions, children, }: MockGuideKitProviderProps): react_jsx_runtime.JSX.Element;
81
+ /**
82
+ * Simulates an assistant response being added to the agent state.
83
+ * Sets the agent state to `{ status: 'speaking', utterance: text }`.
84
+ *
85
+ * Subscribers (e.g. hooks using `useSyncExternalStore`) are notified
86
+ * synchronously, so assertions can run immediately after this call.
87
+ */
88
+ declare function simulateAgentResponse(text: string): void;
89
+ /**
90
+ * Simulates a voice transcript arriving (as if the user spoke).
91
+ * Sets the agent state to `{ status: 'processing', transcript: text }`
92
+ * and marks `voice.isListening` as `false`.
93
+ */
94
+ declare function simulateVoiceInput(text: string): void;
95
+ /**
96
+ * Simulates an error occurring in the agent.
97
+ * Sets the agent state to `{ status: 'error', error }` and populates
98
+ * the store-level `error` field.
99
+ */
100
+ declare function simulateError(error: GuideKitErrorType): void;
101
+ /**
102
+ * Returns the current mock store state. Useful for assertions in tests.
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * const state = getGuideKitTestState();
107
+ * expect(state.status.isReady).toBe(true);
108
+ * ```
109
+ */
110
+ declare function getGuideKitTestState(): GuideKitStore;
111
+ /**
112
+ * Resets the agent state back to idle and clears any error.
113
+ * Useful for cleaning up between simulate* calls in a test.
114
+ */
115
+ declare function resetAgentState(): void;
116
+ /**
117
+ * Sets the `isReady` flag on the mock store. Useful to simulate the SDK
118
+ * finishing initialization.
119
+ */
120
+ declare function simulateReady(isReady?: boolean): void;
121
+ /**
122
+ * Returns the raw TestStore instance for advanced use cases (e.g.,
123
+ * subscribing to changes directly or calling `setState` with a custom
124
+ * updater). Returns `null` if no MockGuideKitProvider is mounted.
125
+ */
126
+ declare function getTestStore_UNSAFE(): TestStore | null;
127
+ /**
128
+ * Cleans up the global test store reference. Call this in `afterEach` or
129
+ * `afterAll` to prevent state leaking between tests.
130
+ */
131
+ declare function cleanupTestStore(): void;
132
+
133
+ export { type MockActions, MockGuideKitProvider, type MockGuideKitProviderProps, type MockInitialState, TestStore, cleanupTestStore, getGuideKitTestState, getTestStore_UNSAFE, resetAgentState, simulateAgentResponse, simulateError, simulateReady, simulateVoiceInput };