@gengage/assistant-fe 0.3.13 → 0.3.15

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.
Files changed (50) hide show
  1. package/dist/assistant-fe.css +1 -1
  2. package/dist/chat/components/ChatDrawer.d.ts +6 -0
  3. package/dist/chat/components/ChatDrawer.d.ts.map +1 -1
  4. package/dist/chat/index.d.ts +1 -0
  5. package/dist/chat/index.d.ts.map +1 -1
  6. package/dist/chat/panel-manager.d.ts +0 -5
  7. package/dist/chat/panel-manager.d.ts.map +1 -1
  8. package/dist/chat/stream-error-display.d.ts +7 -0
  9. package/dist/chat/stream-error-display.d.ts.map +1 -0
  10. package/dist/{chat-BOhy7EbK.js → chat-DIMqb9-7.js} +608 -554
  11. package/dist/chat-DIMqb9-7.js.map +1 -0
  12. package/dist/chat-Djxk60QW.cjs +15 -0
  13. package/dist/chat-Djxk60QW.cjs.map +1 -0
  14. package/dist/chat.cjs +1 -1
  15. package/dist/chat.iife.js +7 -5
  16. package/dist/chat.iife.js.map +1 -1
  17. package/dist/chat.js +1 -1
  18. package/dist/{common-CPy4Ugp4.js → common-CEQ7JL8r.js} +2 -2
  19. package/dist/{common-CPy4Ugp4.js.map → common-CEQ7JL8r.js.map} +1 -1
  20. package/dist/{common-DAF9EBzS.cjs → common-DUmbdVSa.cjs} +2 -2
  21. package/dist/{common-DAF9EBzS.cjs.map → common-DUmbdVSa.cjs.map} +1 -1
  22. package/dist/common.cjs +1 -1
  23. package/dist/common.js +3 -3
  24. package/dist/index.cjs +1 -1
  25. package/dist/index.js +4 -4
  26. package/dist/{native-webview-zQvM9ax7.cjs → native-webview-BOmxxjcL.cjs} +2 -2
  27. package/dist/{native-webview-zQvM9ax7.cjs.map → native-webview-BOmxxjcL.cjs.map} +1 -1
  28. package/dist/{native-webview-lN2TpszQ.js → native-webview-C0Jd4QeV.js} +3 -3
  29. package/dist/{native-webview-lN2TpszQ.js.map → native-webview-C0Jd4QeV.js.map} +1 -1
  30. package/dist/native.cjs +1 -1
  31. package/dist/native.iife.js +7 -5
  32. package/dist/native.iife.js.map +1 -1
  33. package/dist/native.js +1 -1
  34. package/dist/qna/components/TextInput.d.ts.map +1 -1
  35. package/dist/qna-DvgpFom7.cjs +2 -0
  36. package/dist/qna-DvgpFom7.cjs.map +1 -0
  37. package/dist/{qna-BtNfVn3t.js → qna-c7t5suwI.js} +73 -52
  38. package/dist/qna-c7t5suwI.js.map +1 -0
  39. package/dist/qna.cjs +1 -1
  40. package/dist/qna.css +1 -1
  41. package/dist/qna.iife.js +12 -12
  42. package/dist/qna.iife.js.map +1 -1
  43. package/dist/qna.js +1 -1
  44. package/package.json +1 -1
  45. package/dist/chat-BOhy7EbK.js.map +0 -1
  46. package/dist/chat-CaIq8E2N.cjs +0 -13
  47. package/dist/chat-CaIq8E2N.cjs.map +0 -1
  48. package/dist/qna-BtNfVn3t.js.map +0 -1
  49. package/dist/qna-BzoGBbS8.cjs +0 -2
  50. package/dist/qna-BzoGBbS8.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qna-c7t5suwI.js","names":[],"sources":["../src/qna/api.ts","../src/qna/components/ButtonRow.ts","../src/qna/components/TextInput.ts","../src/qna/components/renderUISpec.ts","../src/qna/normalize-ui-specs.ts","../src/qna/locales/tr.ts","../src/qna/locales/en.ts","../src/qna/locales/index.ts","../src/qna/catalog.ts","../src/qna/index.ts"],"sourcesContent":["import { consumeStream } from '../common/streaming.js';\nimport { buildChatEndpointUrl } from '../common/api-paths.js';\nimport { adaptBackendEvent } from '../common/protocol-adapter.js';\nimport type { StreamEvent, UISpec } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface LauncherActionRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n sku: string;\n page_type?: string;\n locale?: string;\n output_language?: string;\n mode?: string;\n}\n\nexport interface LauncherActionResult {\n uiSpecs: UISpec[];\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n}\n\nexport async function fetchLauncherActions(\n request: LauncherActionRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<LauncherActionResult> {\n const url = buildChatEndpointUrl('launcher_action', transport);\n const result: LauncherActionResult = { uiSpecs: [], actions: [] };\n\n const fetchInit: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n };\n if (signal !== undefined) fetchInit.signal = signal;\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const streamOpts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptBackendEvent(event as unknown as Record<string, unknown>);\n\n if (!normalized) return;\n\n if (normalized.type === 'ui_spec') {\n result.uiSpecs.push(normalized.spec);\n }\n\n if (normalized.type === 'ui_spec' && normalized.spec.elements) {\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ActionButton' && el.props?.['action']) {\n const action = el.props['action'] as { title: string; type: string; payload?: unknown };\n result.actions.push(action);\n }\n }\n }\n },\n };\n if (signal !== undefined) streamOpts.signal = signal;\n\n await consumeStream(response, streamOpts);\n\n return result;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface ButtonRowOptions {\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n onAction: (action: ActionPayload) => void;\n ctaText?: string;\n defaultCtaText?: string;\n onOpenChat?: () => void;\n orientation?: 'horizontal' | 'vertical';\n quickQuestionsAriaLabel?: string;\n}\n\nexport function renderButtonRow(options: ButtonRowOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-buttons gds-toolbar';\n container.dataset['gengagePart'] = 'qna-button-row';\n container.setAttribute('role', 'group');\n container.setAttribute('aria-label', options.quickQuestionsAriaLabel ?? 'Quick questions');\n\n if (options.orientation === 'vertical') {\n container.style.flexDirection = 'column';\n }\n\n for (const action of options.actions) {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button gds-chip';\n button.dataset['gengagePart'] = 'qna-quick-question';\n button.textContent = action.title;\n button.type = 'button';\n button.addEventListener('click', () => {\n const actionPayload: ActionPayload = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) actionPayload.payload = action.payload;\n options.onAction(actionPayload);\n });\n container.appendChild(button);\n }\n\n if (options.ctaText || options.onOpenChat) {\n const cta = document.createElement('button');\n cta.className = 'gengage-qna-cta gds-btn gds-btn-secondary';\n cta.dataset['gengagePart'] = 'qna-cta';\n cta.textContent = options.ctaText ?? options.defaultCtaText ?? 'Ask something else';\n cta.type = 'button';\n cta.addEventListener('click', () => {\n options.onOpenChat?.();\n });\n container.appendChild(cta);\n }\n\n return container;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface TextInputOptions {\n placeholders?: string | string[];\n ctaLabel?: string;\n defaultInputPlaceholder?: string;\n askQuestionAriaLabel?: string;\n sendButtonText?: string;\n sendQuestionAriaLabel?: string;\n onSubmit: (action: ActionPayload) => void;\n}\n\nexport function renderTextInput(options: TextInputOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-input-wrapper';\n container.dataset['gengagePart'] = 'qna-input-wrapper';\n\n const combo = document.createElement('div');\n combo.className = 'gengage-qna-input-combo';\n combo.dataset['gengagePart'] = 'qna-input-combo';\n\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'gengage-qna-input';\n input.dataset['gengagePart'] = 'qna-input';\n input.setAttribute('aria-label', options.askQuestionAriaLabel ?? 'Ask a question');\n\n // Rotating placeholders\n const placeholders = Array.isArray(options.placeholders)\n ? options.placeholders\n : options.placeholders\n ? [options.placeholders]\n : [options.defaultInputPlaceholder ?? 'Ask a question...'];\n\n let placeholderIndex = 0;\n let activePlaceholder = placeholders[0] ?? '';\n input.placeholder = activePlaceholder;\n\n let rotateTimer: ReturnType<typeof setInterval> | null = null;\n let fadeTimer: ReturnType<typeof setTimeout> | null = null;\n let isFocused = false;\n\n const stopPlaceholderRotation = () => {\n if (rotateTimer) clearInterval(rotateTimer);\n rotateTimer = null;\n if (fadeTimer) clearTimeout(fadeTimer);\n fadeTimer = null;\n input.classList.remove('gengage-qna-input--fade');\n };\n\n const shouldRotatePlaceholders = () => placeholders.length > 1 && !isFocused && input.value.trim().length === 0;\n\n const startPlaceholderRotation = () => {\n stopPlaceholderRotation();\n if (!shouldRotatePlaceholders()) return;\n rotateTimer = setInterval(() => {\n if (!shouldRotatePlaceholders()) return;\n input.classList.add('gengage-qna-input--fade');\n fadeTimer = setTimeout(() => {\n placeholderIndex = (placeholderIndex + 1) % placeholders.length;\n activePlaceholder = placeholders[placeholderIndex] ?? '';\n input.placeholder = activePlaceholder;\n input.classList.remove('gengage-qna-input--fade');\n }, 180);\n }, 3000);\n };\n\n const actionIcons = document.createElement('div');\n actionIcons.className = 'gengage-qna-input-actions';\n actionIcons.dataset['gengagePart'] = 'qna-input-actions';\n\n const clearBtn = document.createElement('button');\n clearBtn.className = 'gengage-qna-icon-btn gengage-qna-clear gengage-qna-icon-btn--hidden';\n clearBtn.type = 'button';\n clearBtn.dataset['gengagePart'] = 'qna-clear';\n clearBtn.setAttribute('aria-label', 'Clear question');\n clearBtn.innerHTML =\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M18 6L6 18\" /><path d=\"M6 6L18 18\" /></svg>';\n\n const sendBtn = document.createElement('button');\n sendBtn.className = 'gengage-qna-icon-btn gengage-qna-send gengage-qna-icon-btn--hidden';\n sendBtn.type = 'button';\n sendBtn.dataset['gengagePart'] = 'qna-send';\n sendBtn.setAttribute('aria-label', options.sendQuestionAriaLabel ?? 'Send question');\n sendBtn.disabled = true;\n sendBtn.innerHTML = `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M22 2L11 13\" /><path d=\"M22 2L15 22L11 13L2 9L22 2Z\" /></svg><span class=\"gengage-qna-sr-only\">${options.ctaLabel ?? options.sendButtonText ?? 'Ask'}</span>`;\n\n const updateActionButtons = () => {\n const hasValue = input.value.trim().length > 0;\n clearBtn.classList.toggle('gengage-qna-icon-btn--hidden', !hasValue);\n sendBtn.classList.toggle('gengage-qna-icon-btn--hidden', !hasValue);\n sendBtn.classList.toggle('gengage-qna-send--active', hasValue);\n sendBtn.disabled = !hasValue;\n };\n\n const submit = () => {\n const text = input.value.trim();\n if (!text) return;\n options.onSubmit({\n title: text,\n type: 'user_message',\n // Align with chat composer: user_message payload is plain string.\n payload: text,\n });\n input.value = '';\n updateActionButtons();\n startPlaceholderRotation();\n };\n\n clearBtn.addEventListener('click', () => {\n input.value = '';\n updateActionButtons();\n input.focus({ preventScroll: true });\n });\n\n sendBtn.addEventListener('click', submit);\n\n input.addEventListener('focus', () => {\n isFocused = true;\n stopPlaceholderRotation();\n input.placeholder = '';\n });\n\n input.addEventListener('blur', () => {\n isFocused = false;\n if (input.value.trim().length === 0) {\n input.placeholder = activePlaceholder;\n }\n startPlaceholderRotation();\n });\n\n input.addEventListener('input', () => {\n updateActionButtons();\n if (input.value.trim().length > 0) {\n stopPlaceholderRotation();\n return;\n }\n input.placeholder = isFocused ? '' : activePlaceholder;\n startPlaceholderRotation();\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submit();\n }\n if (e.key === 'Escape' && input.value.length > 0) {\n input.value = '';\n updateActionButtons();\n startPlaceholderRotation();\n }\n });\n\n actionIcons.appendChild(clearBtn);\n actionIcons.appendChild(sendBtn);\n combo.appendChild(input);\n combo.appendChild(actionIcons);\n container.appendChild(combo);\n\n updateActionButtons();\n startPlaceholderRotation();\n\n // Cleanup method\n (container as HTMLElement & { _cleanup?: () => void })._cleanup = () => {\n stopPlaceholderRotation();\n };\n\n return container;\n}\n","import { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { UISpec, UIElement, ActionPayload } from '../../common/types.js';\nimport type { QNAUISpecRenderContext } from '../types.js';\nimport { renderButtonRow } from './ButtonRow.js';\nimport { renderTextInput } from './TextInput.js';\n\nexport type QNAUISpecRegistry = UISpecDomRegistry<QNAUISpecRenderContext>;\n\nfunction toActionPayload(raw: unknown, labelFallback?: string): ActionPayload | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const type = obj['type'];\n if (typeof type !== 'string' || type.length === 0) return null;\n\n const titleRaw = obj['title'];\n const payload = obj['payload'];\n const title = typeof titleRaw === 'string' && titleRaw.length > 0 ? titleRaw : labelFallback;\n if (!title) return null;\n\n const action: ActionPayload = { title, type };\n if (payload !== undefined) action.payload = payload;\n return action;\n}\n\nfunction actionPayloadToRowAction(action: ActionPayload): { title: string; type: string; payload?: unknown } {\n const rowAction: { title: string; type: string; payload?: unknown } = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) rowAction.payload = action.payload;\n return rowAction;\n}\n\nfunction collectButtonRowActions(element: UIElement, spec: UISpec): ActionPayload[] {\n const actions: ActionPayload[] = [];\n\n const directActions = element.props?.['actions'];\n if (Array.isArray(directActions)) {\n for (const rawAction of directActions) {\n const normalized = toActionPayload(rawAction);\n if (normalized) actions.push(normalized);\n }\n }\n\n const directButtons = element.props?.['buttons'];\n if (Array.isArray(directButtons)) {\n for (const rawButton of directButtons) {\n if (!rawButton || typeof rawButton !== 'object') continue;\n const obj = rawButton as Record<string, unknown>;\n const label = typeof obj['label'] === 'string' ? obj['label'] : undefined;\n const action = toActionPayload(obj['action'], label);\n if (action) actions.push(action);\n }\n }\n\n if (element.children) {\n for (const childId of element.children) {\n const child = spec.elements[childId];\n if (!child || child.type !== 'ActionButton') continue;\n const label = typeof child.props?.['label'] === 'string' ? child.props['label'] : undefined;\n const action = toActionPayload(child.props?.['action'], label);\n if (action) actions.push(action);\n }\n }\n\n // Deduplicate by title — backend may provide same actions via props and children\n const seen = new Set<string>();\n return actions.filter((a) => {\n if (seen.has(a.title)) return false;\n seen.add(a.title);\n return true;\n });\n}\n\nconst DEFAULT_QNA_UI_SPEC_REGISTRY: QNAUISpecRegistry = {\n ButtonRow: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const orientation = element.props?.['orientation'];\n\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n if (orientation === 'horizontal' || orientation === 'vertical') options.orientation = orientation;\n return renderButtonRow(options);\n },\n\n ActionButtons: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n return renderButtonRow(options);\n },\n\n ActionButton: ({ element, context }) => {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button gds-chip';\n button.type = 'button';\n button.dataset['gengagePart'] = 'qna-action-button';\n\n const label = element.props?.['label'];\n if (typeof label === 'string') {\n button.textContent = label;\n } else {\n button.textContent = context.i18n.defaultCtaText;\n }\n\n const action = toActionPayload(element.props?.['action'], typeof label === 'string' ? label : undefined);\n if (action) {\n button.addEventListener('click', () => context.onAction(action));\n }\n return button;\n },\n\n TextInput: ({ element, context }) => {\n const placeholder = element.props?.['placeholder'];\n const placeholders =\n typeof placeholder === 'string' || Array.isArray(placeholder) ? placeholder : context.inputPlaceholder;\n // Keep input submit label independent from the quick-question CTA text.\n const ctaLabel = typeof element.props?.['ctaLabel'] === 'string' ? element.props['ctaLabel'] : undefined;\n\n const options: import('./TextInput.js').TextInputOptions = {\n onSubmit: context.onAction,\n askQuestionAriaLabel: context.i18n.askQuestionAriaLabel,\n defaultInputPlaceholder: context.i18n.defaultInputPlaceholder,\n sendButtonText: context.i18n.sendButton,\n sendQuestionAriaLabel: context.i18n.sendQuestionAriaLabel,\n };\n if (placeholders !== undefined) options.placeholders = placeholders;\n if (ctaLabel !== undefined) options.ctaLabel = ctaLabel;\n return renderTextInput(options);\n },\n\n QuestionHeading: ({ element }) => {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n heading.dataset['gengagePart'] = 'qna-heading';\n const text = element.props?.['text'];\n heading.textContent = typeof text === 'string' ? text : '';\n return heading;\n },\n\n // ProductCard: no-op — QNA renders only question pills + text input.\n // Backend may send ProductCard but QNA intentionally skips it;\n // the product is shown once chat opens via openWithAction().\n ProductCard: () => null,\n};\n\nexport const defaultQnaUnknownUISpecRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage:qna] Unknown ui_spec component type: ${element.type}`);\n }\n if (!element.children || element.children.length === 0) {\n return null;\n }\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function createDefaultQnaUISpecRegistry(): QNAUISpecRegistry {\n return { ...DEFAULT_QNA_UI_SPEC_REGISTRY };\n}\n\nexport function renderQnaUISpec(\n spec: UISpec,\n context: QNAUISpecRenderContext,\n registry = DEFAULT_QNA_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = defaultQnaUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context,\n registry,\n containerClassName: 'gengage-qna-uispec',\n unknownRenderer,\n });\n}\n","import type { ActionPayload, PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { QNAI18n } from './types.js';\n\n/** SKUs to send with the product-context quick pill (`user_message` + sku_list). */\nexport type MergeQuickPillsOptions = {\n skuList?: string[] | undefined;\n};\n\n/**\n * Resolve SKU list for QNA → chat payloads: current PDP sku, or `visible_skus` on listings.\n */\nexport function resolveQnaSkuListForPayload(pageContext: PageContext | undefined): string[] | undefined {\n if (!pageContext) return undefined;\n const extra = pageContext.extra;\n if (extra && typeof extra === 'object' && !Array.isArray(extra)) {\n const raw = extra['visible_skus'] ?? extra['visibleSkus'];\n if (Array.isArray(raw)) {\n const list = raw\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((s) => s.trim())\n .slice(0, 200);\n if (list.length > 0) return list;\n }\n }\n const sku = typeof pageContext.sku === 'string' && pageContext.sku.trim() ? pageContext.sku.trim() : undefined;\n return sku ? [sku] : undefined;\n}\n\nfunction actionFromProps(props: Record<string, unknown> | undefined, labelFallback?: string): ActionPayload | null {\n if (!props) return null;\n const actionRaw = props['action'];\n if (!actionRaw || typeof actionRaw !== 'object') return null;\n const obj = actionRaw as Record<string, unknown>;\n const type = obj['type'];\n if (typeof type !== 'string' || type.length === 0) return null;\n const titleRaw = obj['title'];\n const title =\n typeof titleRaw === 'string' && titleRaw.length > 0\n ? titleRaw\n : typeof labelFallback === 'string' && labelFallback.length > 0\n ? labelFallback\n : '';\n if (!title) return null;\n const payload = obj['payload'];\n const out: ActionPayload = { title, type };\n if (payload !== undefined) out.payload = payload;\n return out;\n}\n\nfunction rowHasPillWithTitle(spec: UISpec, title: string): boolean {\n const root = spec.elements[spec.root];\n if (!root) return false;\n\n const checkElement = (el: UIElement): boolean => {\n if (el.type !== 'ActionButton') return false;\n const props = el.props;\n if (!props || typeof props !== 'object') return false;\n const label = typeof props['label'] === 'string' ? props['label'] : undefined;\n if (label === title) return true;\n const a = actionFromProps(props as Record<string, unknown>, label);\n return a?.title === title;\n };\n\n if (root.type === 'ActionButton') {\n return checkElement(root);\n }\n if (root.children) {\n for (const id of root.children) {\n const child = spec.elements[id];\n if (child && checkElement(child)) return true;\n }\n }\n if (root.type === 'ActionButtons' && Array.isArray(root.props?.['buttons'])) {\n for (const btn of root.props['buttons'] as Array<{ label?: string; action?: { title?: string } }>) {\n if (btn?.label === title) return true;\n if (btn?.action?.title === title) return true;\n }\n }\n return false;\n}\n\nlet _mergeId = 0;\nfunction nextMergeId(): string {\n _mergeId += 1;\n return `gengage-merge-${_mergeId}`;\n}\n\nfunction prependToButtonRow(spec: UISpec, action: ActionPayload): void {\n const root = spec.elements[spec.root];\n if (!root || root.type !== 'ButtonRow') return;\n const id = nextMergeId();\n spec.elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n ...(action.payload !== undefined ? { payload: action.payload } : {}),\n },\n },\n };\n root.children = root.children ? [id, ...root.children] : [id];\n}\n\nfunction prependToActionButtons(spec: UISpec, action: ActionPayload): void {\n const root = spec.elements[spec.root];\n if (!root || root.type !== 'ActionButtons') return;\n const id = nextMergeId();\n spec.elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n ...(action.payload !== undefined ? { payload: action.payload } : {}),\n },\n },\n };\n root.children = root.children ? [id, ...root.children] : [id];\n const buttons = (root.props?.['buttons'] as Array<Record<string, unknown>> | undefined) ?? [];\n const btnEntry = {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n ...(action.payload !== undefined ? { payload: action.payload } : {}),\n },\n };\n root.props = { ...root.props, buttons: [btnEntry, ...buttons] };\n}\n\nfunction buildSingleButtonRowSpec(actions: ActionPayload[]): UISpec {\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]!;\n const id = `action-${i}`;\n childIds.push(id);\n elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n ...(action.payload !== undefined ? { payload: action.payload } : {}),\n },\n },\n };\n }\n elements['root'] = {\n type: 'ButtonRow',\n children: childIds,\n };\n return { root: 'root', elements };\n}\n\nfunction findFirstPillRowSpec(specs: UISpec[]): UISpec | undefined {\n return specs.find((spec) => {\n const root = spec.elements[spec.root];\n return root?.type === 'ActionButtons' || root?.type === 'ButtonRow';\n });\n}\n\nfunction heroReplacementAction(i18n: QNAI18n, skuList?: string[]): ActionPayload {\n const text = i18n.productContextQuickPillLabel;\n const payload: Record<string, unknown> = { text };\n if (skuList && skuList.length > 0) {\n payload['sku_list'] = skuList;\n }\n return {\n title: text,\n type: 'user_message',\n payload,\n };\n}\n\n/**\n * Removes standalone hero `ActionButton` blocks for `findSimilar` (e.g. from `text_image`)\n * and merges a product-context quick question pill instead (same row as other questions).\n */\nexport function mergeStandaloneFindSimilarIntoQuickPills(\n specs: UISpec[],\n i18n: QNAI18n,\n options?: MergeQuickPillsOptions,\n): UISpec[] {\n const skuList = options?.skuList;\n const extracted: ActionPayload[] = [];\n const filtered: UISpec[] = [];\n\n for (const spec of specs) {\n const root = spec.elements[spec.root];\n if (root?.type === 'ActionButton') {\n const props = root.props as Record<string, unknown> | undefined;\n const label = typeof props?.['label'] === 'string' ? props['label'] : undefined;\n const action = actionFromProps(props, label);\n if (action?.type === 'findSimilar') {\n extracted.push(heroReplacementAction(i18n, skuList));\n continue;\n }\n }\n filtered.push(spec);\n }\n\n if (extracted.length === 0) {\n return specs;\n }\n\n const replacement = heroReplacementAction(i18n, skuList);\n const target = findFirstPillRowSpec(filtered);\n\n if (!target) {\n return [...filtered, buildSingleButtonRowSpec([replacement])];\n }\n\n if (!rowHasPillWithTitle(target, replacement.title)) {\n const root = target.elements[target.root];\n if (root?.type === 'ActionButtons') {\n prependToActionButtons(target, replacement);\n } else if (root?.type === 'ButtonRow') {\n prependToButtonRow(target, replacement);\n }\n }\n\n return filtered;\n}\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_TR: QNAI18n = {\n quickQuestionsAriaLabel: 'Hızlı sorular',\n askQuestionAriaLabel: 'Soru sorun',\n defaultInputPlaceholder: 'Bir soru sorun...',\n sendButton: 'Sor',\n sendQuestionAriaLabel: 'Soruyu gönder',\n defaultCtaText: 'Başka bir şey sor',\n redirectingToChat: 'Sohbete yönlendiriliyor...',\n productContextQuickPillLabel: 'Bu ürün hakkında ne bilmeliyim?',\n};\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_EN: QNAI18n = {\n quickQuestionsAriaLabel: 'Quick questions',\n askQuestionAriaLabel: 'Ask a question',\n defaultInputPlaceholder: 'Ask a question...',\n sendButton: 'Ask',\n sendQuestionAriaLabel: 'Send question',\n defaultCtaText: 'Ask something else',\n redirectingToChat: 'Redirecting to chat...',\n productContextQuickPillLabel: 'What should I know about this product?',\n};\n","import type { QNAI18n } from '../types.js';\nimport { QNA_I18N_TR } from './tr.js';\nimport { QNA_I18N_EN } from './en.js';\n\nfunction normalizeLocale(locale?: string): string {\n if (!locale) return 'tr';\n return locale.toLowerCase().split('-')[0] ?? 'tr';\n}\n\nexport function resolveQnaLocale(locale?: string): QNAI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return QNA_I18N_EN;\n default:\n return QNA_I18N_TR;\n }\n}\n\nexport { QNA_I18N_TR, QNA_I18N_EN };\n","/**\n * QNA widget — json-render catalog definition.\n *\n * Backend endpoint: POST /chat/launcher_action\n * Response format: NDJSON stream, each line a StreamEvent.\n *\n * The backend returns a `ui_spec` event whose elements are typed to the\n * component names defined below. The frontend renders them via ./registry.\n *\n * Customising:\n * Fork this repo and replace ./registry implementations with your own.\n * The catalog schema (component names + prop types) is the API contract\n * with the backend — do not rename components without a backend release.\n */\n\nimport { z } from 'zod';\n\nconst ActionPayloadSchema = z.object({\n title: z.string(),\n type: z.string(),\n payload: z.unknown().optional(),\n});\n\nexport const ActionButtonSchema = z.object({\n label: z.string(),\n action: ActionPayloadSchema,\n variant: z.enum(['primary', 'outline', 'ghost']).optional(),\n});\n\nexport const ButtonRowSchema = z.object({\n orientation: z.enum(['horizontal', 'vertical']).optional(),\n wrap: z.boolean().optional(),\n});\n\nexport const TextInputSchema = z.object({\n placeholder: z.union([z.string(), z.array(z.string())]).optional(),\n ctaLabel: z.string().optional(),\n});\n\nexport const QuestionHeadingSchema = z.object({\n text: z.string(),\n});\n\nexport const qnaCatalog = {\n components: {\n ActionButton: {\n schema: ActionButtonSchema,\n description: 'A single clickable QNA action button.',\n },\n ButtonRow: {\n schema: ButtonRowSchema,\n description: 'Container for a group of QNA action buttons.',\n },\n TextInput: {\n schema: TextInputSchema,\n description: 'Free-text input with rotating placeholder and CTA button.',\n },\n QuestionHeading: {\n schema: QuestionHeadingSchema,\n description: 'A heading displayed above the QNA button group.',\n },\n },\n} as const;\n\nexport type QNACatalog = typeof qnaCatalog;\nexport type QNAComponentName = keyof QNACatalog['components'];\n","/**\n * QNA widget -- public entry point.\n *\n * Renders contextual action buttons (and an optional free-text input) on\n * product or content pages. When a user taps a button, the widget opens\n * the Chat widget with that action pre-loaded.\n *\n * Backend: POST /chat/launcher_action\n * Protocol: NDJSON stream -> json-render UISpec -> ActionButton / ButtonRow / TextInput\n */\n\nimport type { ActionPayload, PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\nimport type { UISpecRenderHelpers } from '../common/renderer/index.js';\nimport { mergeUISpecRegistry } from '../common/renderer/index.js';\nimport { BaseWidget } from '../common/widget-base.js';\nimport { dispatch } from '../common/events.js';\nimport { trackConnectionWarningRequest } from '../common/connection-warning.js';\nimport { getGlobalErrorMessage } from '../common/global-error-toast.js';\nimport {\n streamStartEvent,\n streamDoneEvent,\n streamErrorEvent,\n widgetHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { fetchLauncherActions } from './api.js';\nimport * as ga from '../common/ga-datalayer.js';\nimport {\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n renderQnaUISpec,\n} from './components/renderUISpec.js';\nimport { mergeStandaloneFindSimilarIntoQuickPills, resolveQnaSkuListForPayload } from './normalize-ui-specs.js';\nimport type { QNAWidgetConfig, QNAI18n, QNAUISpecRenderContext } from './types.js';\nimport { QNA_I18N_TR, resolveQnaLocale } from './locales/index.js';\n\n// Inline CSS import marker - Vite will bundle this\nimport './components/qna.css';\n\n/**\n * Contextual Q&A action buttons for product pages.\n * Renders quick-action buttons that open the chat widget with a pre-built query.\n *\n * @example\n * ```ts\n * import { GengageQNA, wireQNAToChat, bootstrapSession } from '@gengage/assistant-fe';\n *\n * const qna = new GengageQNA();\n * await qna.init({\n * accountId: 'mystore',\n * middlewareUrl: 'https://chat.gengage.ai',\n * mountTarget: '#qna-section',\n * pageContext: { pageType: 'pdp', sku: '12345' },\n * session: { sessionId: bootstrapSession() },\n * });\n * wireQNAToChat(); // Wire button clicks to chat.openWithAction()\n * ```\n */\nexport class GengageQNA extends BaseWidget<QNAWidgetConfig> {\n private _abortController: AbortController | null = null;\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private _contentEl: HTMLElement | null = null;\n private _lastSku: string | undefined;\n private _i18n: QNAI18n = QNA_I18N_TR;\n\n protected async onInit(config: QNAWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n\n this._contentEl = document.createElement('div');\n this._contentEl.className = 'gengage-qna-container';\n this._contentEl.dataset['gengagePart'] = 'qna-container';\n this.root.appendChild(this._contentEl);\n\n const sku = config.pageContext?.sku;\n if (sku) {\n this._lastSku = sku;\n await this._fetchAndRender(sku);\n }\n\n ga.trackInit('qna');\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n const newSku = context.sku;\n if (!newSku || newSku === this._lastSku) return;\n\n // Debounce rapid SPA navigations\n if (this._debounceTimer) clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this._lastSku = newSku;\n void this._fetchAndRender(newSku);\n }, 50);\n }\n\n protected onShow(): void {\n if (this._contentEl) {\n this._contentEl.style.opacity = '0';\n this._contentEl.style.transition = 'opacity 0.2s ease-in';\n requestAnimationFrame(() => {\n if (this._contentEl) this._contentEl.style.opacity = '1';\n });\n }\n }\n\n protected onHide(): void {\n // Preserve fetched data for re-show\n }\n\n protected onDestroy(): void {\n this._abort();\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n if (this._contentEl) {\n this._cleanupTextInputTimers();\n this._contentEl.remove();\n this._contentEl = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private _abort(): void {\n this._abortController?.abort();\n this._abortController = null;\n }\n\n /** Clean up TextInput placeholder rotation timers to prevent interval leaks. */\n private _cleanupTextInputTimers(): void {\n if (!this._contentEl) return;\n const wrappers = this._contentEl.querySelectorAll('.gengage-qna-input-wrapper');\n for (const wrapper of wrappers) {\n (wrapper as HTMLElement & { _cleanup?: () => void })._cleanup?.();\n }\n }\n\n private async _fetchAndRender(sku: string): Promise<void> {\n this._abort();\n this._abortController = new AbortController();\n\n if (!this._contentEl) return;\n // Clean up TextInput timers before clearing DOM to prevent interval leaks\n this._cleanupTextInputTimers();\n this._contentEl.innerHTML = '';\n\n // Show loading dots\n const loading = this._createLoadingIndicator();\n this._contentEl.appendChild(loading);\n\n const transport: ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n };\n\n const requestId = crypto.randomUUID();\n const fetchStart = Date.now();\n const releaseConnectionWarning = trackConnectionWarningRequest({\n source: 'qna',\n locale: this.config.locale,\n });\n\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'launcher_action',\n request_id: requestId,\n widget: 'qna',\n }),\n );\n\n try {\n const launcherReq: import('./api.js').LauncherActionRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n sku,\n locale: this.config.locale ?? 'tr',\n };\n const pageType = this.config.pageContext?.pageType;\n if (pageType !== undefined) launcherReq.page_type = pageType;\n\n const result = await fetchLauncherActions(launcherReq, transport, this._abortController.signal);\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: result.actions.length,\n widget: 'qna',\n }),\n );\n\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: result.actions.length,\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'qna',\n }),\n );\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n const panel = document.createElement('div');\n panel.className = 'gengage-qna-panel gds-panel';\n panel.dataset['gengagePart'] = 'qna-panel';\n this._contentEl.appendChild(panel);\n\n const hasQuestionHeading = this._specIncludesType(result.uiSpecs, 'QuestionHeading');\n\n // Render heading if configured and backend didn't provide one\n if (!hasQuestionHeading && this.config.showStaticQuestion && this.config.staticQuestionText) {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n heading.textContent = this.config.staticQuestionText;\n panel.appendChild(heading);\n }\n\n const cfgPlaceholders = this.config.inputPlaceholder;\n let effectivePlaceholders: string | string[];\n if (cfgPlaceholders !== true) {\n effectivePlaceholders = cfgPlaceholders ?? this._i18n.defaultInputPlaceholder;\n } else if (result.actions.length > 0) {\n // Only use question-like actions as rotating placeholders\n const filtered = result.actions\n .filter((a) => a.type === 'user_message' || a.title.includes('?'))\n .map((a) => a.title);\n effectivePlaceholders = filtered.length > 0 ? filtered : this._i18n.defaultInputPlaceholder;\n } else {\n effectivePlaceholders = this._i18n.defaultInputPlaceholder;\n }\n\n const renderContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n };\n if (!this.config.hideButtonRowCta) {\n renderContext.onOpenChat = this._openChatHandler;\n if (this.config.ctaText !== undefined) renderContext.ctaText = this.config.ctaText;\n }\n if (effectivePlaceholders !== undefined) renderContext.inputPlaceholder = effectivePlaceholders;\n\n const fallbackSpec = this._buildFallbackActionsSpec(result.actions);\n const quickPillSkuList = resolveQnaSkuListForPayload(this.config.pageContext);\n const specsToRender =\n result.uiSpecs.length > 0\n ? mergeStandaloneFindSimilarIntoQuickPills(result.uiSpecs, this._i18n, {\n skuList: quickPillSkuList,\n })\n : [fallbackSpec];\n const nonEmptySpecs = specsToRender.filter((spec) => Object.keys(spec.elements).length > 0);\n\n for (const spec of nonEmptySpecs) {\n const rendered = this._renderUISpec(spec, renderContext);\n panel.appendChild(rendered);\n }\n\n if (nonEmptySpecs.length > 0) {\n ga.trackShow('qna');\n }\n\n const shouldRenderStandaloneInput = !this._specIncludesType(nonEmptySpecs, 'TextInput');\n if (shouldRenderStandaloneInput) {\n this._appendStandaloneInput(renderContext, effectivePlaceholders, panel);\n }\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n\n dispatch('gengage:global:error', {\n source: 'qna',\n code: 'FETCH_ERROR',\n message: getGlobalErrorMessage(this.config.locale, err),\n });\n\n this.track(\n streamErrorEvent(this.analyticsContext(), {\n request_id: requestId,\n error_code: 'FETCH_ERROR',\n error_message: err instanceof Error ? err.message : String(err),\n widget: 'qna',\n }),\n );\n\n // Keep QNA usable during backend hiccups: render at least free-text input.\n if (this._contentEl) {\n this._cleanupTextInputTimers();\n this._contentEl.innerHTML = '';\n const errPanel = document.createElement('div');\n errPanel.className = 'gengage-qna-panel';\n this._contentEl.appendChild(errPanel);\n const fallbackPlaceholders =\n this.config.inputPlaceholder === true\n ? this._i18n.defaultInputPlaceholder\n : (this.config.inputPlaceholder ?? this._i18n.defaultInputPlaceholder);\n const fallbackContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n onOpenChat: this._openChatHandler,\n };\n if (this.config.ctaText !== undefined) fallbackContext.ctaText = this.config.ctaText;\n this._appendStandaloneInput(fallbackContext, fallbackPlaceholders, errPanel);\n }\n\n if (import.meta.env?.DEV) {\n console.error('[gengage:qna] Failed to fetch launcher actions:', err);\n }\n } finally {\n releaseConnectionWarning();\n }\n }\n\n private _createLoadingIndicator(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'gengage-qna-loading';\n for (let i = 0; i < 3; i++) {\n const dot = document.createElement('div');\n dot.className = 'gengage-qna-loading-dot';\n el.appendChild(dot);\n }\n return el;\n }\n\n private _resolveI18n(config: QNAWidgetConfig): QNAI18n {\n const base = resolveQnaLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry() {\n const baseRegistry = createDefaultQnaUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _renderUISpec(spec: UISpec, context: QNAUISpecRenderContext): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultQnaUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: QNAUISpecRenderContext) =>\n renderQnaUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<QNAUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n\n private _specIncludesType(specs: UISpec[], type: string): boolean {\n for (const spec of specs) {\n for (const element of Object.values(spec.elements)) {\n if (element.type === type) return true;\n }\n }\n return false;\n }\n\n private _buildFallbackActionsSpec(actions: Array<{ title: string; type: string; payload?: unknown }>): UISpec {\n if (actions.length === 0) {\n return { root: 'root', elements: {} };\n }\n\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]!;\n const id = `action-${i}`;\n childIds.push(id);\n elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n payload: action.payload,\n },\n },\n };\n }\n elements['root'] = {\n type: 'ButtonRow',\n children: childIds,\n };\n return {\n root: 'root',\n elements,\n };\n }\n\n private _appendStandaloneInput(\n context: QNAUISpecRenderContext,\n placeholder?: string | string[],\n parent?: HTMLElement,\n ): void {\n if (!this._contentEl) return;\n const inputSpec: UISpec = {\n root: 'root',\n elements: {\n root: {\n type: 'TextInput',\n props: {\n placeholder,\n },\n },\n },\n };\n const renderedInput = this._renderUISpec(inputSpec, context);\n (parent ?? this._contentEl).appendChild(renderedInput);\n }\n\n private _handleAction(action: ActionPayload): void {\n this._showTransitionIndicator();\n ga.trackSuggestedQuestion(action.title, action.type);\n this.config.onActionSelected?.(action);\n // Delay the bridge dispatch so the transition indicator is visible for a\n // moment before the chat overlay takes over — without the delay both happen\n // in the same task and the indicator is never painted.\n setTimeout(() => dispatch('gengage:qna:action', action), 350);\n }\n\n private _handleOpenChat(): void {\n this._showTransitionIndicator();\n this.config.onOpenChat?.();\n // Same 350ms delay so the indicator is perceptible before chat opens.\n setTimeout(() => dispatch('gengage:qna:open-chat', {}), 350);\n }\n\n private _showTransitionIndicator(): void {\n if (!this._contentEl) return;\n // Remove any previously appended indicator to prevent duplicates on rapid clicks\n this._contentEl.querySelector('.gengage-qna-transition-indicator')?.remove();\n this._contentEl.classList.add('gengage-qna--transitioning');\n const msg = this._i18n.redirectingToChat ?? 'Redirecting to chat...';\n const indicator = document.createElement('div');\n indicator.className = 'gengage-qna-transition-indicator';\n indicator.textContent = msg;\n const panel = this._contentEl.querySelector('.gengage-qna-panel');\n (panel ?? this._contentEl).appendChild(indicator);\n setTimeout(() => {\n this._contentEl?.classList.remove('gengage-qna--transitioning');\n indicator.remove();\n }, 600);\n }\n\n _actionHandler = this._handleAction.bind(this);\n _openChatHandler = this._handleOpenChat.bind(this);\n}\n\nexport function createQNAWidget(): GengageQNA {\n return new GengageQNA();\n}\n\nexport type { QNAWidgetConfig, QNAUIComponents, QNAI18n, QNAUISpecRenderContext, QNARendererConfig } from './types.js';\nexport {\n renderQnaUISpec,\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { QNAUISpecRegistry } from './components/renderUISpec.js';\nexport { qnaCatalog } from './catalog.js';\nexport type { QNACatalog, QNAComponentName } from './catalog.js';\n"],"mappings":"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"}
package/dist/qna.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./qna-BzoGBbS8.cjs`);exports.GengageQNA=e.t,exports.createDefaultQnaUISpecRegistry=e.i,exports.createQNAWidget=e.n,exports.defaultQnaUnknownUISpecRenderer=e.a,exports.qnaCatalog=e.r,exports.renderQnaUISpec=e.o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./qna-DvgpFom7.cjs`);exports.GengageQNA=e.t,exports.createDefaultQnaUISpecRegistry=e.i,exports.createQNAWidget=e.n,exports.defaultQnaUnknownUISpecRenderer=e.a,exports.qnaCatalog=e.r,exports.renderQnaUISpec=e.o;
package/dist/qna.css CHANGED
@@ -1 +1 @@
1
- :where(:root,.gengage-chat-root,.gengage-qna-container,.gengage-simrel-container,.gengage-simbut-root){--ds-neutral-0:#fff;--ds-neutral-25:#fcfcfd;--ds-neutral-50:#f6f7fb;--ds-neutral-100:#f3f4f6;--ds-neutral-200:#e5e7eb;--ds-neutral-300:#d0d5dd;--ds-neutral-500:#667085;--ds-neutral-600:#475467;--ds-neutral-700:#344054;--ds-neutral-900:#111827;--ds-radius-2:8px;--ds-radius-3:12px;--ds-radius-4:16px;--ds-radius-5:20px;--ds-radius-6:24px;--ds-radius-pill:999px;--ds-shadow-1:0 1px 2px #1018280a, 0 1px 3px #1018280f;--ds-shadow-2:0 4px 12px #10182814;--ds-shadow-3:0 10px 24px #1018281f;--client-primary:var(--gengage-primary-color,#b7102a);--client-primary-hover:var(--gengage-primary-hover,color-mix(in srgb, var(--client-primary) 88%, black 12%));--client-primary-active:var(--gengage-primary-active,color-mix(in srgb, var(--client-primary) 78%, black 22%));--client-primary-subtle:color-mix(in srgb, var(--client-primary) 12%, white);--client-primary-soft:color-mix(in srgb, var(--client-primary) 20%, white);--client-on-primary:var(--gengage-primary-foreground,#fff);--client-focus-ring:color-mix(in srgb, var(--client-primary) 32%, transparent);--ai-accent-start:#0b24d6;--ai-accent-end:#f768f2;--ai-accent-soft:linear-gradient(135deg, #0b24d614, #f768f214);--surface-page:var(--gengage-page-bg,var(--ds-neutral-50));--surface-shell:var(--gengage-shell-bg,#10131a);--surface-card:var(--gengage-background-color,var(--ds-neutral-0));--surface-card-muted:var(--gengage-surface-soft,#f8fafc);--surface-card-soft:var(--surface-card-muted);--surface-elevated:var(--gengage-surface-elevated,var(--ds-neutral-0));--surface-input:var(--gengage-input-bg,var(--ds-neutral-0));--surface-overlay:var(--gengage-overlay-bg,#10131a85);--text-primary:var(--gengage-foreground-color,var(--ds-neutral-900));--text-secondary:var(--gengage-text-secondary,#4b5563);--text-muted:var(--gengage-text-muted,#6b7280);--text-inverse:var(--gengage-text-inverse,#f9fafb);--border-subtle:var(--gengage-border-subtle,#1118270f);--border-default:var(--gengage-border-color,#1118271a);--border-strong:var(--gengage-border-strong,#1118272e);--shadow-1:var(--gengage-shadow-1,var(--ds-shadow-1));--shadow-2:var(--gengage-shadow-2,var(--ds-shadow-2));--shadow-3:var(--gengage-shadow-3,var(--ds-shadow-3));--radius-control:var(--gengage-control-radius,var(--ds-radius-3));--radius-card:var(--gengage-card-radius,var(--ds-radius-4));--radius-panel:var(--gengage-panel-radius,var(--ds-radius-6));--radius-pill:var(--gengage-pill-radius,var(--ds-radius-pill));--success:var(--gengage-success-color,#16a34a);--warning:var(--gengage-warning-color,#d97706);--error:var(--gengage-error-color,#dc2626);--info:var(--gengage-info-color,#2563eb);--rating:var(--gengage-rating-color,#f5b301);--gengage-primary:var(--client-primary);--gengage-primary-soft:var(--client-primary-soft);--gengage-primary-subtle:var(--client-primary-subtle);--gengage-text-color:var(--text-primary);--gengage-text-secondary:var(--text-secondary);--gengage-hover-color:var(--surface-card-soft);--ds-button-primary-bg:var(--client-primary);--ds-button-primary-bg-hover:var(--client-primary-hover);--ds-button-primary-bg-active:var(--client-primary-active);--ds-button-primary-fg:var(--client-on-primary);--ds-button-primary-border:color-mix(in srgb, var(--client-primary) 82%, black 18%);--ds-button-secondary-bg:var(--surface-card);--ds-button-secondary-bg-hover:var(--client-primary-subtle);--ds-button-secondary-fg:var(--client-primary);--ds-button-secondary-border:color-mix(in srgb, var(--client-primary) 26%, white);--ds-button-ghost-bg:var(--surface-card-muted);--ds-button-ghost-bg-hover:var(--ds-button-ghost-bg);--ds-button-ghost-fg:var(--text-primary);--ds-button-ghost-fg-hover:var(--client-primary);--ds-button-ghost-border:var(--border-default);--ds-button-ghost-border-hover:color-mix(in srgb, var(--client-primary) 18%, white);--ds-panel-bg:var(--surface-card);--ds-panel-border:var(--border-default);--ds-panel-shadow:var(--shadow-1);--ds-panel-radius:var(--radius-panel);--ds-header-bg:var(--surface-card);--ds-header-fg:var(--text-primary);--ds-header-muted:var(--text-muted);--ds-header-border:var(--border-default);--ds-card-bg:var(--surface-card);--ds-card-bg-soft:var(--surface-card-muted);--ds-card-border:var(--border-default);--ds-card-shadow:var(--shadow-1);--ds-card-shadow-hover:var(--shadow-2);--ds-card-radius:var(--radius-card);--ds-card-border-hover:color-mix(in srgb, var(--client-primary) 14%, var(--border-default));--ds-card-bg-hover:color-mix(in srgb, var(--client-primary) 2%, var(--surface-card));--ds-product-card-media-bg:var(--surface-card-muted);--ds-product-card-media-border:var(--border-subtle);--ds-input-bg:var(--surface-input);--ds-input-border:var(--border-default);--ds-input-radius:16px;--ds-input-focus-border:color-mix(in srgb, var(--client-primary) 28%, white);--ds-input-focus-ring:0 0 0 4px var(--client-focus-ring);--ds-input-highlight:inset 0 1px 0 #fff9;--ds-chip-bg:var(--surface-card);--ds-chip-border:var(--border-default);--ds-chip-fg:var(--text-secondary);--ds-chip-bg-hover:var(--surface-card-muted);--ds-chip-bg-active:color-mix(in srgb, var(--client-primary) 8%, white);--ds-chip-border-active:color-mix(in srgb, var(--client-primary) 30%, white);--ds-chip-fg-active:var(--client-primary);--ds-tab-bg:var(--surface-card);--ds-tab-bg-hover:var(--surface-card-muted);--ds-tab-bg-active:color-mix(in srgb, var(--client-primary) 8%, white);--ds-tab-border:var(--border-default);--ds-tab-border-active:color-mix(in srgb, var(--client-primary) 26%, white);--ds-tab-fg:var(--text-secondary);--ds-tab-fg-active:var(--client-primary);--ds-badge-brand-bg:color-mix(in srgb, var(--client-primary) 10%, white);--ds-badge-brand-border:color-mix(in srgb, var(--client-primary) 18%, white);--ds-badge-brand-fg:var(--client-primary);--ds-message-user-bg:color-mix(in srgb, var(--client-primary) 10%, white);--ds-message-user-fg:var(--text-primary);--ds-message-user-border:color-mix(in srgb, var(--client-primary) 18%, var(--border-default));--ds-message-user-shadow:none;--ds-message-assistant-bg:var(--surface-card-soft);--ds-message-assistant-fg:var(--text-primary);--ds-message-assistant-border:var(--border-default);--ds-message-assistant-shadow:none;--ds-message-active-outline:color-mix(in srgb, var(--client-primary) 68%, white);--ds-progress-card-border:var(--border-subtle);--ds-progress-mark-bg:color-mix(in srgb, var(--ai-accent-start) 8%, var(--surface-card));--ds-progress-mark-border:color-mix(in srgb, var(--ai-accent-start) 12%, var(--border-default));--ds-progress-scrollbar-thumb:color-mix(in srgb, var(--text-primary) 18%, transparent);--ds-toast-error-bg:color-mix(in srgb, var(--error) 5%, var(--surface-card));--ds-toast-error-border:color-mix(in srgb, var(--error) 18%, var(--border-default));--ds-toast-error-accent:var(--error);--ds-toast-error-fg:color-mix(in srgb, var(--error) 22%, var(--text-primary));--ds-toast-error-shadow:var(--shadow-3);--ds-comparison-table-bg:var(--surface-card);--ds-comparison-table-border:var(--border-default);--ds-comparison-table-header-bg:var(--surface-card-muted);--ds-comparison-table-header-fg:var(--text-muted);--ds-comparison-table-row-border:var(--border-subtle);--ds-comparison-table-winner-bg:color-mix(in srgb, var(--client-primary) 6%, white);--ds-comparison-table-winner-fg:var(--client-primary)}:where(.gds-panel){background:var(--ds-panel-bg);border:1px solid var(--ds-panel-border);border-radius:var(--ds-panel-radius);box-shadow:var(--ds-panel-shadow)}:where(.gengage-qna-panel,.gengage-chat-panel-topbar,.gengage-chat-chat-header,.gengage-chat-panel-ai-zone>.gengage-chat-ai-top-picks,.gengage-chat-grounding-review){border-color:var(--ds-panel-border)}:where(.gds-btn){border-radius:var(--radius-control);min-height:46px;font:inherit;cursor:pointer;border:0;outline:none;justify-content:center;align-items:center;gap:10px;padding:0 18px;font-weight:700;transition:box-shadow .15s,border-color .15s,background-color .15s,color .15s;display:inline-flex}:where(.gds-btn:hover){transform:none}:where(.gds-btn:focus-visible){outline:2px solid var(--client-focus-ring);outline-offset:2px}:where(.gds-btn:disabled){cursor:not-allowed;opacity:.56;box-shadow:none}:where(.gds-btn-primary){background:var(--ds-button-primary-bg);color:var(--ds-button-primary-fg);border:1px solid var(--ds-button-primary-border)}:where(.gds-btn-primary:hover){background:var(--ds-button-primary-bg-hover)}:where(.gds-btn-secondary){background:var(--ds-button-secondary-bg);color:var(--ds-button-secondary-fg);border:1px solid var(--ds-button-secondary-border)}:where(.gds-btn-secondary:hover){background:var(--ds-button-secondary-bg-hover)}:where(.gds-btn-ghost){background:var(--ds-button-ghost-bg);color:var(--ds-button-ghost-fg);border:1px solid var(--ds-button-ghost-border)}:where(.gds-btn-ghost:hover){background:var(--ds-button-ghost-bg-hover);border-color:var(--ds-button-ghost-border-hover);color:var(--ds-button-ghost-fg-hover)}:where(.gds-chip){border-radius:var(--radius-pill);border:1px solid var(--ds-chip-border);background:var(--ds-chip-bg);color:var(--ds-chip-fg);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:700;transition:background-color .15s,border-color .15s,color .15s,box-shadow .15s;display:inline-flex}:where(.gds-chip:hover){background:var(--ds-chip-bg-hover);border-color:color-mix(in srgb, var(--client-primary) 16%, var(--ds-chip-border))}:where(.gds-chip:focus-visible){outline:2px solid var(--client-focus-ring);outline-offset:2px}:where(.gds-chip-active){border-color:var(--ds-chip-border-active);background:var(--ds-chip-bg-active);color:var(--ds-chip-fg-active)}:where(.gds-badge){border-radius:var(--radius-pill);letter-spacing:.04em;align-items:center;min-height:28px;padding:0 10px;font-size:11px;font-weight:800;display:inline-flex}:where(.gds-badge-brand){background:var(--ds-badge-brand-bg);color:var(--ds-badge-brand-fg);border:1px solid var(--ds-badge-brand-border)}:where(.gds-shell-header){background:var(--ds-header-bg);color:var(--ds-header-fg);border-bottom:1px solid var(--ds-header-border);box-shadow:none;justify-content:space-between;align-items:center;gap:14px;padding:14px 16px;display:flex}:where(.gds-shell-header [data-gengage-part=chat-header-powered-by]){color:var(--ds-header-muted)}:where(.gds-icon-btn){border-radius:var(--radius-control);width:42px;min-width:42px;height:42px;min-height:42px;padding:0}:where(.gds-input-shell){border-radius:var(--ds-input-radius);border:1px solid var(--ds-input-border);background:var(--ds-input-bg);min-height:52px;box-shadow:var(--ds-input-highlight);align-items:center;gap:12px;padding:6px 6px 6px 14px;transition:border-color .15s,box-shadow .15s,background-color .15s;display:flex}:where(.gds-input-shell:focus-within){border-color:var(--ds-input-focus-border);box-shadow:var(--ds-input-focus-ring)}:where(.gds-tab){border-radius:var(--radius-pill);border:1px solid var(--ds-tab-border);background:var(--ds-tab-bg);color:var(--ds-tab-fg);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:700;transition:background-color .15s,border-color .15s,color .15s;display:inline-flex}:where(.gds-tab:hover){background:var(--ds-tab-bg-hover)}:where(.gds-tab:focus-visible){outline:2px solid var(--client-focus-ring);outline-offset:2px}:where(.gds-tab[aria-selected=true],.gds-tab.is-active){color:var(--ds-tab-fg-active);border-color:var(--ds-tab-border-active);background:var(--ds-tab-bg-active)}:where(.gds-toolbar){flex-wrap:wrap;align-items:center;gap:10px;display:flex}:where(.gds-toolbar-compact){gap:8px}:where(.gds-card){background:var(--ds-card-bg);border:1px solid var(--ds-card-border);border-radius:var(--ds-card-radius);box-shadow:var(--ds-card-shadow);transition:border-color .15s,box-shadow .15s,background-color .15s}:where(.gds-card-interactive),:where(.gds-clickable){cursor:pointer}:where(.gds-card-interactive:hover){background:var(--ds-card-bg-hover);border-color:var(--ds-card-border-hover);box-shadow:var(--ds-card-shadow-hover)}:where(.gds-card-soft){background:var(--ds-card-bg-soft)}:where(.gds-product-card){border-radius:16px}:where(.gds-evidence-card){background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-control);box-shadow:var(--shadow-1)}:where(.gds-evidence-card-success){background:color-mix(in srgb, var(--success) 10%, white);border-color:color-mix(in srgb, var(--success) 22%, var(--border-default))}:where(.gds-evidence-card-danger){background:color-mix(in srgb, var(--error) 8%, white);border-color:color-mix(in srgb, var(--error) 20%, var(--border-default))}:where(.gds-evidence-card-warning){background:color-mix(in srgb, var(--warning) 10%, white);border-color:color-mix(in srgb, var(--warning) 22%, var(--border-default))}:where(.gds-message){border-radius:calc(var(--radius-control) + 4px);word-wrap:break-word;overflow-wrap:break-word;border:1px solid #0000;max-width:85%;padding:14px 16px;font-size:14px;font-weight:400;line-height:1.55;animation:.3s cubic-bezier(.2,.7,.2,1) gengage-chat-msg-in}:where(.gds-message-user){background:var(--ds-message-user-bg);color:var(--ds-message-user-fg);border-color:var(--ds-message-user-border);box-shadow:var(--ds-message-user-shadow);border-bottom-right-radius:6px;align-self:flex-end}:where(.gds-message-assistant){background:var(--ds-message-assistant-bg);color:var(--ds-message-assistant-fg);border-color:var(--ds-message-assistant-border);box-shadow:var(--ds-message-assistant-shadow);border-bottom-left-radius:6px;align-self:flex-start;min-width:120px}:where(.gds-message-active){outline:2px solid var(--ds-message-active-outline);outline-offset:-2px}:where(.gds-ai-card){background:var(--surface-card);border:1px solid var(--ds-progress-card-border);border-radius:20px;gap:16px;padding:18px;display:grid}:where(.gds-ai-mark){background:var(--ds-progress-mark-bg);width:42px;height:42px;color:var(--ai-accent-start);border:1px solid var(--ds-progress-mark-border);border-radius:14px;place-items:center;display:grid}:where(.gds-ai-loader-row){align-items:center;gap:12px;display:flex}:where(.gds-progress-loader){border:1px solid color-mix(in srgb, var(--ai-accent-start) 10%, var(--border-default));background:linear-gradient(110deg, var(--surface-card-soft) 8%, color-mix(in srgb, var(--ai-accent-start) 5%, var(--surface-card)) 18%, var(--surface-card-soft) 33%);width:fit-content;max-width:100%;color:var(--text-secondary);background-size:220% 100%;border-radius:14px;align-items:center;gap:10px;padding:8px 14px;animation:1.8s linear infinite gds-progress-shimmer;display:inline-flex}:where(.gds-progress-loader-chat){box-sizing:border-box;align-self:flex-start;width:100%;min-width:0;max-width:85%;display:flex}:where(.gds-progress-loader-chat) .gds-progress-label{overflow-wrap:anywhere;flex:auto;min-width:0}:where(.gds-progress-loader-panel){box-sizing:border-box;justify-content:flex-start;align-items:center;width:100%;min-width:0;max-width:100%;display:flex}:where(.gds-progress-loader-panel) .gds-progress-label{overflow-wrap:anywhere;flex:auto;min-width:0}:where(.gds-progress-label){min-width:0;color:var(--text-secondary);word-break:break-word;font-size:13px;line-height:1.5}:where(.gds-progress-dots){flex-shrink:0;align-items:center;gap:6px;display:inline-flex}:where(.gds-progress-dot){background:color-mix(in srgb, var(--ai-accent-start) 20%, var(--text-muted));border-radius:50%;width:8px;height:8px;animation:1.2s ease-in-out infinite gds-progress-dot-pulse;display:inline-block}:where(.gds-progress-dot:nth-child(2)){animation-delay:.2s}:where(.gds-progress-dot:nth-child(3)){animation-delay:.4s}:where(.gds-ai-status){border-radius:calc(var(--radius-control) + 2px);border:1px solid var(--border-default);background:var(--surface-card-muted);max-width:85%;color:var(--text-secondary);border-bottom-left-radius:6px;align-self:flex-start;align-items:center;gap:8px;padding:10px 14px;display:flex}:where(.gds-ai-status-text){color:var(--text-secondary);font-size:13px;font-style:italic}:where(.gds-ai-dot-loader){align-items:center;gap:5px;display:inline-flex}:where(.gds-ai-dot-loader span){background:color-mix(in srgb, var(--ai-accent-start) 38%, var(--text-muted));border-radius:50%;width:6px;height:6px;animation:1.2s ease-in-out infinite gds-progress-dot-pulse;display:inline-block}:where(.gds-ai-dot-loader span:nth-child(2)){animation-delay:.2s}:where(.gds-ai-dot-loader span:nth-child(3)){animation-delay:.4s}:where(.gds-ai-spinner){border:2.5px solid var(--border-default);border-top-color:var(--ai-accent-start);border-radius:50%;flex-shrink:0;width:26px;height:26px;animation:.72s linear infinite gds-spin}@keyframes gds-spin{to{transform:rotate(360deg)}}@keyframes gds-progress-shimmer{0%{background-position:200% 0}to{background-position:-20% 0}}@keyframes gds-progress-dot-pulse{0%,to{opacity:.45;transform:scale(.7)}50%{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){:where(.gds-progress-loader){animation:none}:where(.gds-progress-dot){opacity:.85;animation:none;transform:scale(1)}:where(.gds-ai-spinner){animation:none}:where(.gds-ai-dot-loader span){opacity:.85;animation:none}}:where(.gds-menu){border-radius:var(--radius-card);border:1px solid var(--border-default);background:var(--surface-elevated);box-shadow:var(--shadow-3);padding:4px}:where(.gds-menu-option){border-radius:calc(var(--radius-control) - 4px);width:100%;color:var(--text-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:8px 10px;font-size:12px;font-weight:500;line-height:1.25;transition:background-color .15s,color .15s;display:flex}:where(.gds-menu-option:hover){background:var(--surface-card-muted)}:where(.gds-menu-option:focus-visible){outline:2px solid var(--client-focus-ring);outline-offset:2px}:where(.gds-menu-option-active){background:var(--client-primary-subtle);color:var(--client-primary);font-weight:600}:where(.gds-comparison-table){border-collapse:separate;border-spacing:0;border:1px solid var(--ds-comparison-table-border);background:var(--ds-comparison-table-bg);border-radius:20px;width:100%;overflow:hidden}:where(.gds-comparison-table th,.gds-comparison-table td){text-align:left;border-bottom:1px solid var(--ds-comparison-table-row-border);padding:14px 16px;font-size:13px}:where(.gds-comparison-table th){background:var(--ds-comparison-table-header-bg);text-transform:uppercase;letter-spacing:.08em;color:var(--ds-comparison-table-header-fg);font-size:11px}:where(.gds-comparison-table tr:last-child td){border-bottom:0}:where(.gds-comparison-table-winner-cell){background:var(--ds-comparison-table-winner-bg);color:var(--ds-comparison-table-winner-fg);font-weight:800}.gengage-qna-container{font-family:var(--gengage-font-family,"Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);font-size:var(--gengage-font-size,14px);color:var(--text-primary);--_gengage-border-color:var(--border-default);--_gengage-text-primary:var(--text-primary);--_gengage-text-secondary:var(--text-secondary);--_gengage-qna-panel-surface:var(--gengage-qna-panel-bg,var(--surface-card));--_gengage-qna-icon-color:var(--text-muted);--_gengage-qna-send-divider:color-mix(in srgb, var(--client-primary) 22%, var(--border-default) 78%);--_gengage-qna-transition-overlay:color-mix(in srgb, var(--surface-card) 78%, transparent);position:relative}.gengage-qna-panel{z-index:0;isolation:isolate;background:var(--_gengage-qna-panel-surface);border:1px solid var(--_gengage-border-color);border-radius:var(--gengage-qna-panel-radius,var(--ds-panel-radius));margin-bottom:var(--gengage-qna-panel-margin-bottom,18px);margin-top:var(--gengage-qna-panel-margin-top,18px);box-shadow:var(--ds-panel-shadow);padding:16px 16px 14px;position:relative}.gengage-qna-panel>:not(.gengage-qna-transition-indicator){z-index:0;position:relative}.gengage-qna-panel .gengage-qna-heading:first-child{margin-top:0}.gengage-qna-uispec{flex-direction:column;gap:8px;display:flex}.gengage-qna-uispec>*{animation:.15s cubic-bezier(.2,.72,.2,1) both gengage-qna-enter}@keyframes gengage-qna-enter{0%{opacity:0;transform:translateY(4px)scale(.995)}to{opacity:1;transform:none}}.gengage-qna-buttons{flex-wrap:wrap;gap:8px;padding:4px 0 10px;display:flex}.gengage-qna-button{border:1px solid var(--ds-button-primary-border);border-radius:var(--radius-pill,var(--gengage-qna-pill-radius,999px));background:var(--ds-button-primary-bg);min-height:40px;color:var(--ds-button-primary-fg);cursor:pointer;text-align:left;justify-content:center;align-items:center;padding:8px 14px;font-family:inherit;font-size:13px;font-weight:700;line-height:1.25;transition:filter .14s,transform .12s;display:inline-flex}.gengage-qna-button:hover{background:var(--ds-button-primary-bg-hover);transform:translateY(-1px)}.gengage-qna-button:active{transform:translateY(1px)scale(.988)}.gengage-qna-button:focus-visible{outline:2px solid var(--client-primary);outline-offset:2px}.gengage-qna-cta{border:1px solid var(--ds-button-secondary-border);border-radius:var(--radius-pill,var(--gengage-qna-pill-radius,999px));background:var(--ds-button-secondary-bg);min-height:40px;color:var(--ds-button-secondary-fg);cursor:pointer;opacity:.92;white-space:nowrap;align-items:center;padding:8px 14px;font-family:inherit;font-size:13px;font-weight:700;transition:opacity .12s,transform .12s;display:inline-flex}.gengage-qna-cta:hover{background:var(--ds-button-secondary-bg-hover);transform:translateY(-1px)}.gengage-qna-cta:focus-visible{outline:2px solid var(--client-primary);outline-offset:2px}.gengage-qna-input-wrapper{padding:6px 0 0}.gengage-qna-input-combo{border:1px solid var(--ds-input-border);border-radius:var(--gengage-qna-input-radius,var(--ds-input-radius));background:var(--ds-input-bg);min-height:48px;box-shadow:var(--ds-input-highlight);flex-direction:row;align-items:stretch;transition:border-color .14s,box-shadow .14s;display:flex;position:relative;overflow:hidden}.gengage-qna-input-combo:before{content:"";border:2px solid var(--_gengage-qna-icon-color);box-sizing:border-box;pointer-events:none;border-radius:999px;width:18px;height:18px;position:absolute;top:50%;left:14px;transform:translateY(-50%)}.gengage-qna-input-combo:after{content:"";background:var(--_gengage-qna-icon-color);transform-origin:50%;pointer-events:none;border-radius:999px;width:8px;height:2px;position:absolute;top:50%;left:28px;transform:translateY(4px)rotate(45deg)}.gengage-qna-input-combo:focus-within{border-color:var(--ds-input-focus-border);box-shadow:var(--ds-input-focus-ring)}.gengage-qna-input{background:0 0;border:none;border-radius:0;outline:none;flex:1;min-width:0;height:48px;padding:0 12px 0 40px;font-family:inherit;font-size:15px;transition:none}.gengage-qna-input::placeholder{transition:opacity .18s}.gengage-qna-input--fade::placeholder{opacity:0}.gengage-qna-send{border:none;border-left:1px solid var(--_gengage-qna-send-divider);background:var(--ds-button-primary-bg);min-width:52px;min-height:0;color:var(--ds-button-primary-fg);cursor:pointer;white-space:nowrap;border-radius:0;flex-shrink:0;align-self:stretch;margin:0;padding:0 18px;font-family:inherit;font-size:14px;font-weight:600;transition:filter .12s}.gengage-qna-input-combo .gengage-qna-send.gds-btn{border:none;border-left:1px solid var(--_gengage-qna-send-divider);min-height:0;box-shadow:none;border-radius:0}.gengage-qna-input-combo .gengage-qna-send.gds-btn-primary{border:none;border-left:1px solid var(--_gengage-qna-send-divider)}.gengage-qna-send:hover{background:var(--ds-button-primary-bg-hover)}.gengage-qna-send:focus-visible{outline:2px solid var(--client-primary);outline-offset:-2px;z-index:1}.gengage-qna-send:active{background:var(--ds-button-primary-bg-active)}.gengage-qna-heading{color:var(--_gengage-text-primary);margin:0 0 6px;font-size:1.04em;font-weight:700}.gengage-qna-loading{gap:4px;padding:12px 0;display:flex}.gengage-qna-loading-dot{background:var(--client-primary);opacity:.4;border-radius:50%;width:7px;height:7px;animation:1.4s ease-in-out infinite both gengage-qna-pulse}.gengage-qna-loading-dot:first-child{animation-delay:0s}.gengage-qna-loading-dot:nth-child(2){animation-delay:.16s}.gengage-qna-loading-dot:nth-child(3){animation-delay:.32s}@keyframes gengage-qna-pulse{0%,80%,to{opacity:.4;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}@media (width<=768px){.gengage-qna-buttons{gap:10px;padding:8px 0 12px}.gengage-qna-button,.gengage-qna-cta{min-height:44px;padding:10px 16px;font-size:14px;line-height:1.2}.gengage-qna-input{font-size:16px}.gengage-qna-send{padding:0 14px;font-size:14px}}@media (prefers-reduced-motion:reduce){.gengage-qna-uispec>*,.gengage-qna-button,.gengage-qna-cta,.gengage-qna-send,.gengage-qna--transitioning,.gengage-qna-transition-indicator{transition:none!important;animation:none!important;transform:none!important}}.gengage-qna--transitioning{opacity:.7;pointer-events:none;transition:opacity .2s}.gengage-qna-transition-indicator{z-index:2147483647;box-sizing:border-box;color:var(--client-primary);text-align:center;pointer-events:none;background:var(--_gengage-qna-transition-overlay);-webkit-backdrop-filter:blur(4px);border-radius:inherit;justify-content:center;align-items:center;padding:16px;font-size:12px;font-weight:500;line-height:1.35;animation:.15s gengage-qna-fade-in;display:flex;position:absolute;inset:0}@keyframes gengage-qna-fade-in{0%{opacity:0}to{opacity:1}}
1
+ :where(:root,.gengage-chat-root,.gengage-qna-container,.gengage-simrel-container,.gengage-simbut-root){--ds-neutral-0:#fff;--ds-neutral-25:#fcfcfd;--ds-neutral-50:#f6f7fb;--ds-neutral-100:#f3f4f6;--ds-neutral-200:#e5e7eb;--ds-neutral-300:#d0d5dd;--ds-neutral-500:#667085;--ds-neutral-600:#475467;--ds-neutral-700:#344054;--ds-neutral-900:#111827;--ds-radius-2:8px;--ds-radius-3:12px;--ds-radius-4:16px;--ds-radius-5:20px;--ds-radius-6:24px;--ds-radius-pill:999px;--ds-shadow-1:0 1px 2px #1018280a, 0 1px 3px #1018280f;--ds-shadow-2:0 4px 12px #10182814;--ds-shadow-3:0 10px 24px #1018281f;--client-primary:var(--gengage-primary-color,#b7102a);--client-primary-hover:var(--gengage-primary-hover,color-mix(in srgb, var(--client-primary) 88%, black 12%));--client-primary-active:var(--gengage-primary-active,color-mix(in srgb, var(--client-primary) 78%, black 22%));--client-primary-subtle:color-mix(in srgb, var(--client-primary) 12%, white);--client-primary-soft:color-mix(in srgb, var(--client-primary) 20%, white);--client-on-primary:var(--gengage-primary-foreground,#fff);--client-focus-ring:color-mix(in srgb, var(--client-primary) 32%, transparent);--ai-accent-start:#0b24d6;--ai-accent-end:#f768f2;--ai-accent-soft:linear-gradient(135deg, #0b24d614, #f768f214);--surface-page:var(--gengage-page-bg,var(--ds-neutral-50));--surface-shell:var(--gengage-shell-bg,#10131a);--surface-card:var(--gengage-background-color,var(--ds-neutral-0));--surface-card-muted:var(--gengage-surface-soft,#f8fafc);--surface-card-soft:var(--surface-card-muted);--surface-elevated:var(--gengage-surface-elevated,var(--ds-neutral-0));--surface-input:var(--gengage-input-bg,var(--ds-neutral-0));--surface-overlay:var(--gengage-overlay-bg,#10131a85);--text-primary:var(--gengage-foreground-color,var(--ds-neutral-900));--text-secondary:var(--gengage-text-secondary,#4b5563);--text-muted:var(--gengage-text-muted,#6b7280);--text-inverse:var(--gengage-text-inverse,#f9fafb);--border-subtle:var(--gengage-border-subtle,#1118270f);--border-default:var(--gengage-border-color,#1118271a);--border-strong:var(--gengage-border-strong,#1118272e);--shadow-1:var(--gengage-shadow-1,var(--ds-shadow-1));--shadow-2:var(--gengage-shadow-2,var(--ds-shadow-2));--shadow-3:var(--gengage-shadow-3,var(--ds-shadow-3));--radius-control:var(--gengage-control-radius,var(--ds-radius-3));--radius-card:var(--gengage-card-radius,var(--ds-radius-4));--radius-panel:var(--gengage-panel-radius,var(--ds-radius-6));--radius-pill:var(--gengage-pill-radius,var(--ds-radius-pill));--success:var(--gengage-success-color,#16a34a);--warning:var(--gengage-warning-color,#d97706);--error:var(--gengage-error-color,#dc2626);--info:var(--gengage-info-color,#2563eb);--rating:var(--gengage-rating-color,#f5b301);--gengage-primary:var(--client-primary);--gengage-primary-soft:var(--client-primary-soft);--gengage-primary-subtle:var(--client-primary-subtle);--gengage-text-color:var(--text-primary);--gengage-text-secondary:var(--text-secondary);--gengage-hover-color:var(--surface-card-soft);--ds-button-primary-bg:var(--client-primary);--ds-button-primary-bg-hover:var(--client-primary-hover);--ds-button-primary-bg-active:var(--client-primary-active);--ds-button-primary-fg:var(--client-on-primary);--ds-button-primary-border:color-mix(in srgb, var(--client-primary) 82%, black 18%);--ds-button-secondary-bg:var(--surface-card);--ds-button-secondary-bg-hover:var(--client-primary-subtle);--ds-button-secondary-fg:var(--client-primary);--ds-button-secondary-border:color-mix(in srgb, var(--client-primary) 26%, white);--ds-button-ghost-bg:var(--surface-card-muted);--ds-button-ghost-bg-hover:var(--ds-button-ghost-bg);--ds-button-ghost-fg:var(--text-primary);--ds-button-ghost-fg-hover:var(--client-primary);--ds-button-ghost-border:var(--border-default);--ds-button-ghost-border-hover:color-mix(in srgb, var(--client-primary) 18%, white);--ds-panel-bg:var(--surface-card);--ds-panel-border:var(--border-default);--ds-panel-shadow:var(--shadow-1);--ds-panel-radius:var(--radius-panel);--ds-header-bg:var(--surface-card);--ds-header-fg:var(--text-primary);--ds-header-muted:var(--text-muted);--ds-header-border:var(--border-default);--ds-card-bg:var(--surface-card);--ds-card-bg-soft:var(--surface-card-muted);--ds-card-border:var(--border-default);--ds-card-shadow:var(--shadow-1);--ds-card-shadow-hover:var(--shadow-2);--ds-card-radius:var(--radius-card);--ds-card-border-hover:color-mix(in srgb, var(--client-primary) 14%, var(--border-default));--ds-card-bg-hover:color-mix(in srgb, var(--client-primary) 2%, var(--surface-card));--ds-product-card-media-bg:var(--surface-card-muted);--ds-product-card-media-border:var(--border-subtle);--ds-input-bg:var(--surface-input);--ds-input-border:var(--border-default);--ds-input-radius:16px;--ds-input-focus-border:color-mix(in srgb, var(--client-primary) 28%, white);--ds-input-focus-ring:0 0 0 4px var(--client-focus-ring);--ds-input-highlight:inset 0 1px 0 #fff9;--ds-chip-bg:var(--surface-card);--ds-chip-border:var(--border-default);--ds-chip-fg:var(--text-secondary);--ds-chip-bg-hover:var(--surface-card-muted);--ds-chip-bg-active:color-mix(in srgb, var(--client-primary) 8%, white);--ds-chip-border-active:color-mix(in srgb, var(--client-primary) 30%, white);--ds-chip-fg-active:var(--client-primary);--ds-tab-bg:var(--surface-card);--ds-tab-bg-hover:var(--surface-card-muted);--ds-tab-bg-active:color-mix(in srgb, var(--client-primary) 8%, white);--ds-tab-border:var(--border-default);--ds-tab-border-active:color-mix(in srgb, var(--client-primary) 26%, white);--ds-tab-fg:var(--text-secondary);--ds-tab-fg-active:var(--client-primary);--ds-badge-brand-bg:color-mix(in srgb, var(--client-primary) 10%, white);--ds-badge-brand-border:color-mix(in srgb, var(--client-primary) 18%, white);--ds-badge-brand-fg:var(--client-primary);--ds-message-user-bg:color-mix(in srgb, var(--client-primary) 10%, white);--ds-message-user-fg:var(--text-primary);--ds-message-user-border:color-mix(in srgb, var(--client-primary) 18%, var(--border-default));--ds-message-user-shadow:none;--ds-message-assistant-bg:var(--surface-card-soft);--ds-message-assistant-fg:var(--text-primary);--ds-message-assistant-border:var(--border-default);--ds-message-assistant-shadow:none;--ds-message-active-outline:color-mix(in srgb, var(--client-primary) 68%, white);--ds-progress-card-border:var(--border-subtle);--ds-progress-mark-bg:color-mix(in srgb, var(--ai-accent-start) 8%, var(--surface-card));--ds-progress-mark-border:color-mix(in srgb, var(--ai-accent-start) 12%, var(--border-default));--ds-progress-scrollbar-thumb:color-mix(in srgb, var(--text-primary) 18%, transparent);--ds-toast-error-bg:color-mix(in srgb, var(--error) 5%, var(--surface-card));--ds-toast-error-border:color-mix(in srgb, var(--error) 18%, var(--border-default));--ds-toast-error-accent:var(--error);--ds-toast-error-fg:color-mix(in srgb, var(--error) 22%, var(--text-primary));--ds-toast-error-shadow:var(--shadow-3);--ds-comparison-table-bg:var(--surface-card);--ds-comparison-table-border:var(--border-default);--ds-comparison-table-header-bg:var(--surface-card-muted);--ds-comparison-table-header-fg:var(--text-muted);--ds-comparison-table-row-border:var(--border-subtle);--ds-comparison-table-winner-bg:color-mix(in srgb, var(--client-primary) 6%, white);--ds-comparison-table-winner-fg:var(--client-primary)}:where(.gds-panel){background:var(--ds-panel-bg);border:1px solid var(--ds-panel-border);border-radius:var(--ds-panel-radius);box-shadow:var(--ds-panel-shadow)}:where(.gengage-qna-panel,.gengage-chat-panel-topbar,.gengage-chat-chat-header,.gengage-chat-panel-ai-zone>.gengage-chat-ai-top-picks,.gengage-chat-grounding-review){border-color:var(--ds-panel-border)}:where(.gds-btn){border-radius:var(--radius-control);min-height:46px;font:inherit;cursor:pointer;border:0;outline:none;justify-content:center;align-items:center;gap:10px;padding:0 18px;font-weight:700;transition:box-shadow .15s,border-color .15s,background-color .15s,color .15s;display:inline-flex}:where(.gds-btn:hover){transform:none}:where(.gds-btn:focus-visible){outline:2px solid var(--client-focus-ring);outline-offset:2px}:where(.gds-btn:disabled){cursor:not-allowed;opacity:.56;box-shadow:none}:where(.gds-btn-primary){background:var(--ds-button-primary-bg);color:var(--ds-button-primary-fg);border:1px solid var(--ds-button-primary-border)}:where(.gds-btn-primary:hover){background:var(--ds-button-primary-bg-hover)}:where(.gds-btn-secondary){background:var(--ds-button-secondary-bg);color:var(--ds-button-secondary-fg);border:1px solid var(--ds-button-secondary-border)}:where(.gds-btn-secondary:hover){background:var(--ds-button-secondary-bg-hover)}:where(.gds-btn-ghost){background:var(--ds-button-ghost-bg);color:var(--ds-button-ghost-fg);border:1px solid var(--ds-button-ghost-border)}:where(.gds-btn-ghost:hover){background:var(--ds-button-ghost-bg-hover);border-color:var(--ds-button-ghost-border-hover);color:var(--ds-button-ghost-fg-hover)}:where(.gds-chip){border-radius:var(--radius-pill);border:1px solid var(--ds-chip-border);background:var(--ds-chip-bg);color:var(--ds-chip-fg);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:700;transition:background-color .15s,border-color .15s,color .15s,box-shadow .15s;display:inline-flex}:where(.gds-chip:hover){background:var(--ds-chip-bg-hover);border-color:color-mix(in srgb, var(--client-primary) 16%, var(--ds-chip-border))}:where(.gds-chip:focus-visible){outline:2px solid var(--client-focus-ring);outline-offset:2px}:where(.gds-chip-active){border-color:var(--ds-chip-border-active);background:var(--ds-chip-bg-active);color:var(--ds-chip-fg-active)}:where(.gds-badge){border-radius:var(--radius-pill);letter-spacing:.04em;align-items:center;min-height:28px;padding:0 10px;font-size:11px;font-weight:800;display:inline-flex}:where(.gds-badge-brand){background:var(--ds-badge-brand-bg);color:var(--ds-badge-brand-fg);border:1px solid var(--ds-badge-brand-border)}:where(.gds-shell-header){background:var(--ds-header-bg);color:var(--ds-header-fg);border-bottom:1px solid var(--ds-header-border);box-shadow:none;justify-content:space-between;align-items:center;gap:14px;padding:14px 16px;display:flex}:where(.gds-shell-header [data-gengage-part=chat-header-powered-by]){color:var(--ds-header-muted)}:where(.gds-icon-btn){border-radius:var(--radius-control);width:42px;min-width:42px;height:42px;min-height:42px;padding:0}:where(.gds-input-shell){border-radius:var(--ds-input-radius);border:1px solid var(--ds-input-border);background:var(--ds-input-bg);min-height:52px;box-shadow:var(--ds-input-highlight);align-items:center;gap:12px;padding:6px 6px 6px 14px;transition:border-color .15s,box-shadow .15s,background-color .15s;display:flex}:where(.gds-input-shell:focus-within){border-color:var(--ds-input-focus-border);box-shadow:var(--ds-input-focus-ring)}:where(.gds-tab){border-radius:var(--radius-pill);border:1px solid var(--ds-tab-border);background:var(--ds-tab-bg);color:var(--ds-tab-fg);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:700;transition:background-color .15s,border-color .15s,color .15s;display:inline-flex}:where(.gds-tab:hover){background:var(--ds-tab-bg-hover)}:where(.gds-tab:focus-visible){outline:2px solid var(--client-focus-ring);outline-offset:2px}:where(.gds-tab[aria-selected=true],.gds-tab.is-active){color:var(--ds-tab-fg-active);border-color:var(--ds-tab-border-active);background:var(--ds-tab-bg-active)}:where(.gds-toolbar){flex-wrap:wrap;align-items:center;gap:10px;display:flex}:where(.gds-toolbar-compact){gap:8px}:where(.gds-card){background:var(--ds-card-bg);border:1px solid var(--ds-card-border);border-radius:var(--ds-card-radius);box-shadow:var(--ds-card-shadow);transition:border-color .15s,box-shadow .15s,background-color .15s}:where(.gds-card-interactive),:where(.gds-clickable){cursor:pointer}:where(.gds-card-interactive:hover){background:var(--ds-card-bg-hover);border-color:var(--ds-card-border-hover);box-shadow:var(--ds-card-shadow-hover)}:where(.gds-card-soft){background:var(--ds-card-bg-soft)}:where(.gds-product-card){border-radius:16px}:where(.gds-evidence-card){background:var(--surface-card);border:1px solid var(--border-default);border-radius:var(--radius-control);box-shadow:var(--shadow-1)}:where(.gds-evidence-card-success){background:color-mix(in srgb, var(--success) 10%, white);border-color:color-mix(in srgb, var(--success) 22%, var(--border-default))}:where(.gds-evidence-card-danger){background:color-mix(in srgb, var(--error) 8%, white);border-color:color-mix(in srgb, var(--error) 20%, var(--border-default))}:where(.gds-evidence-card-warning){background:color-mix(in srgb, var(--warning) 10%, white);border-color:color-mix(in srgb, var(--warning) 22%, var(--border-default))}:where(.gds-message){border-radius:calc(var(--radius-control) + 4px);word-wrap:break-word;overflow-wrap:break-word;border:1px solid #0000;max-width:85%;padding:14px 16px;font-size:14px;font-weight:400;line-height:1.55;animation:.3s cubic-bezier(.2,.7,.2,1) gengage-chat-msg-in}:where(.gds-message-user){background:var(--ds-message-user-bg);color:var(--ds-message-user-fg);border-color:var(--ds-message-user-border);box-shadow:var(--ds-message-user-shadow);border-bottom-right-radius:6px;align-self:flex-end}:where(.gds-message-assistant){background:var(--ds-message-assistant-bg);color:var(--ds-message-assistant-fg);border-color:var(--ds-message-assistant-border);box-shadow:var(--ds-message-assistant-shadow);border-bottom-left-radius:6px;align-self:flex-start;min-width:120px}:where(.gds-message-active){outline:2px solid var(--ds-message-active-outline);outline-offset:-2px}:where(.gds-ai-card){background:var(--surface-card);border:1px solid var(--ds-progress-card-border);border-radius:20px;gap:16px;padding:18px;display:grid}:where(.gds-ai-mark){background:var(--ds-progress-mark-bg);width:42px;height:42px;color:var(--ai-accent-start);border:1px solid var(--ds-progress-mark-border);border-radius:14px;place-items:center;display:grid}:where(.gds-ai-loader-row){align-items:center;gap:12px;display:flex}:where(.gds-progress-loader){border:1px solid color-mix(in srgb, var(--ai-accent-start) 10%, var(--border-default));background:linear-gradient(110deg, var(--surface-card-soft) 8%, color-mix(in srgb, var(--ai-accent-start) 5%, var(--surface-card)) 18%, var(--surface-card-soft) 33%);width:fit-content;max-width:100%;color:var(--text-secondary);background-size:220% 100%;border-radius:14px;align-items:center;gap:10px;padding:8px 14px;animation:1.8s linear infinite gds-progress-shimmer;display:inline-flex}:where(.gds-progress-loader-chat){box-sizing:border-box;align-self:flex-start;width:100%;min-width:0;max-width:85%;display:flex}:where(.gds-progress-loader-chat) .gds-progress-label{overflow-wrap:anywhere;flex:auto;min-width:0}:where(.gds-progress-loader-panel){box-sizing:border-box;justify-content:flex-start;align-items:center;width:100%;min-width:0;max-width:100%;display:flex}:where(.gds-progress-loader-panel) .gds-progress-label{overflow-wrap:anywhere;flex:auto;min-width:0}:where(.gds-progress-label){min-width:0;color:var(--text-secondary);word-break:break-word;font-size:13px;line-height:1.5}:where(.gds-progress-dots){flex-shrink:0;align-items:center;gap:6px;display:inline-flex}:where(.gds-progress-dot){background:color-mix(in srgb, var(--ai-accent-start) 20%, var(--text-muted));border-radius:50%;width:8px;height:8px;animation:1.2s ease-in-out infinite gds-progress-dot-pulse;display:inline-block}:where(.gds-progress-dot:nth-child(2)){animation-delay:.2s}:where(.gds-progress-dot:nth-child(3)){animation-delay:.4s}:where(.gds-ai-status){border-radius:calc(var(--radius-control) + 2px);border:1px solid var(--border-default);background:var(--surface-card-muted);max-width:85%;color:var(--text-secondary);border-bottom-left-radius:6px;align-self:flex-start;align-items:center;gap:8px;padding:10px 14px;display:flex}:where(.gds-ai-status-text){color:var(--text-secondary);font-size:13px;font-style:italic}:where(.gds-ai-dot-loader){align-items:center;gap:5px;display:inline-flex}:where(.gds-ai-dot-loader span){background:color-mix(in srgb, var(--ai-accent-start) 38%, var(--text-muted));border-radius:50%;width:6px;height:6px;animation:1.2s ease-in-out infinite gds-progress-dot-pulse;display:inline-block}:where(.gds-ai-dot-loader span:nth-child(2)){animation-delay:.2s}:where(.gds-ai-dot-loader span:nth-child(3)){animation-delay:.4s}:where(.gds-ai-spinner){border:2.5px solid var(--border-default);border-top-color:var(--ai-accent-start);border-radius:50%;flex-shrink:0;width:26px;height:26px;animation:.72s linear infinite gds-spin}@keyframes gds-spin{to{transform:rotate(360deg)}}@keyframes gds-progress-shimmer{0%{background-position:200% 0}to{background-position:-20% 0}}@keyframes gds-progress-dot-pulse{0%,to{opacity:.45;transform:scale(.7)}50%{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){:where(.gds-progress-loader){animation:none}:where(.gds-progress-dot){opacity:.85;animation:none;transform:scale(1)}:where(.gds-ai-spinner){animation:none}:where(.gds-ai-dot-loader span){opacity:.85;animation:none}}:where(.gds-menu){border-radius:var(--radius-card);border:1px solid var(--border-default);background:var(--surface-elevated);box-shadow:var(--shadow-3);padding:4px}:where(.gds-menu-option){border-radius:calc(var(--radius-control) - 4px);width:100%;color:var(--text-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:8px 10px;font-size:12px;font-weight:500;line-height:1.25;transition:background-color .15s,color .15s;display:flex}:where(.gds-menu-option:hover){background:var(--surface-card-muted)}:where(.gds-menu-option:focus-visible){outline:2px solid var(--client-focus-ring);outline-offset:2px}:where(.gds-menu-option-active){background:var(--client-primary-subtle);color:var(--client-primary);font-weight:600}:where(.gds-comparison-table){border-collapse:separate;border-spacing:0;border:1px solid var(--ds-comparison-table-border);background:var(--ds-comparison-table-bg);border-radius:20px;width:100%;overflow:hidden}:where(.gds-comparison-table th,.gds-comparison-table td){text-align:left;border-bottom:1px solid var(--ds-comparison-table-row-border);padding:14px 16px;font-size:13px}:where(.gds-comparison-table th){background:var(--ds-comparison-table-header-bg);text-transform:uppercase;letter-spacing:.08em;color:var(--ds-comparison-table-header-fg);font-size:11px}:where(.gds-comparison-table tr:last-child td){border-bottom:0}:where(.gds-comparison-table-winner-cell){background:var(--ds-comparison-table-winner-bg);color:var(--ds-comparison-table-winner-fg);font-weight:800}.gengage-qna-container{font-family:var(--gengage-font-family,"Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);font-size:var(--gengage-font-size,14px);color:var(--text-primary);--_gengage-border-color:var(--border-default);--_gengage-text-primary:var(--text-primary);--_gengage-text-secondary:var(--text-secondary);--_gengage-qna-panel-surface:var(--gengage-qna-panel-bg,var(--surface-card));--_gengage-qna-icon-color:var(--gengage-qna-icon-color,var(--text-muted));--_gengage-qna-transition-overlay:color-mix(in srgb, var(--surface-card) 78%, transparent);--_gengage-qna-pill-bg:var(--gengage-qna-pill-bg,var(--ds-button-primary-bg));--_gengage-qna-pill-bg-hover:var(--gengage-qna-pill-bg-hover,var(--ds-button-primary-bg-hover));--_gengage-qna-pill-fg:var(--gengage-qna-pill-fg,var(--ds-button-primary-fg));--_gengage-qna-pill-border:var(--gengage-qna-pill-border,var(--ds-button-primary-border));--_gengage-qna-pill-border-hover:var(--gengage-qna-pill-border-hover,var(--_gengage-qna-pill-border));--_gengage-qna-input-bg:var(--gengage-qna-input-bg,var(--ds-input-bg));--_gengage-qna-input-border:var(--gengage-qna-input-border,var(--ds-input-border));--_gengage-qna-action-icon-bg-hover:var(--gengage-qna-action-icon-bg-hover,color-mix(in srgb, var(--client-primary) 10%, transparent));--_gengage-qna-clear-color:var(--gengage-qna-clear-color,var(--text-muted));--_gengage-qna-send-color:var(--gengage-qna-send-color,var(--client-primary));--_gengage-qna-send-color-disabled:var(--gengage-qna-send-color-disabled,color-mix(in srgb, var(--text-muted) 60%, transparent));--_gengage-qna-action-icon-size:var(--gengage-qna-action-icon-size,20px);position:relative}.gengage-qna-panel{z-index:0;isolation:isolate;background:var(--_gengage-qna-panel-surface);border:1px solid var(--_gengage-border-color);border-radius:var(--gengage-qna-panel-radius,var(--ds-panel-radius));margin-bottom:var(--gengage-qna-panel-margin-bottom,18px);margin-top:var(--gengage-qna-panel-margin-top,18px);box-shadow:var(--ds-panel-shadow);padding:16px 16px 14px;position:relative}.gengage-qna-panel>:not(.gengage-qna-transition-indicator){z-index:0;position:relative}.gengage-qna-panel .gengage-qna-heading:first-child{margin-top:0}.gengage-qna-uispec{flex-direction:column;gap:8px;display:flex}.gengage-qna-uispec>*{animation:.15s cubic-bezier(.2,.72,.2,1) both gengage-qna-enter}@keyframes gengage-qna-enter{0%{opacity:0;transform:translateY(4px)scale(.995)}to{opacity:1;transform:none}}.gengage-qna-buttons{flex-wrap:wrap;gap:8px;padding:4px 0 10px;display:flex}.gengage-qna-button{border:1px solid var(--_gengage-qna-pill-border);border-radius:var(--radius-pill,var(--gengage-qna-pill-radius,999px));background:var(--_gengage-qna-pill-bg);min-height:40px;color:var(--_gengage-qna-pill-fg);cursor:pointer;text-align:left;justify-content:center;align-items:center;padding:8px 14px;font-family:inherit;font-size:13px;font-weight:700;line-height:1.25;transition:background-color .14s,border-color .14s,color .14s,transform .12s;display:inline-flex}.gengage-qna-button:hover{background:var(--_gengage-qna-pill-bg-hover);border-color:var(--_gengage-qna-pill-border-hover);transform:translateY(-1px)}.gengage-qna-button:active{transform:translateY(1px)scale(.988)}.gengage-qna-button:focus-visible{outline:2px solid var(--client-primary);outline-offset:2px}.gengage-qna-cta{border:1px solid var(--ds-button-secondary-border);border-radius:var(--radius-pill,var(--gengage-qna-pill-radius,999px));background:var(--ds-button-secondary-bg);min-height:40px;color:var(--ds-button-secondary-fg);cursor:pointer;opacity:.92;white-space:nowrap;align-items:center;padding:8px 14px;font-family:inherit;font-size:13px;font-weight:700;transition:opacity .12s,transform .12s;display:inline-flex}.gengage-qna-cta:hover{background:var(--ds-button-secondary-bg-hover);transform:translateY(-1px)}.gengage-qna-cta:focus-visible{outline:2px solid var(--client-primary);outline-offset:2px}.gengage-qna-input-wrapper{padding:6px 0 0}.gengage-qna-input-combo{border:1px solid var(--_gengage-qna-input-border);border-radius:var(--gengage-qna-input-radius,var(--ds-input-radius));background:var(--_gengage-qna-input-bg);min-height:48px;box-shadow:var(--ds-input-highlight);flex-direction:row;align-items:center;transition:border-color .14s,box-shadow .14s;display:flex;position:relative;overflow:hidden}.gengage-qna-input-combo:before{content:"";border:2px solid var(--_gengage-qna-icon-color);box-sizing:border-box;pointer-events:none;border-radius:999px;width:18px;height:18px;position:absolute;top:50%;left:14px;transform:translateY(-50%)}.gengage-qna-input-combo:after{content:"";background:var(--_gengage-qna-icon-color);transform-origin:50%;pointer-events:none;border-radius:999px;width:8px;height:2px;position:absolute;top:50%;left:28px;transform:translateY(4px)rotate(45deg)}.gengage-qna-input-combo:focus-within{border-color:var(--ds-input-focus-border);box-shadow:var(--ds-input-focus-ring)}.gengage-qna-input{background:0 0;border:none;border-radius:0;outline:none;flex:1;min-width:0;height:48px;padding:0 10px 0 40px;font-family:inherit;font-size:15px;transition:none}.gengage-qna-input::placeholder{transition:opacity .18s}.gengage-qna-input--fade::placeholder{opacity:0}.gengage-qna-input-actions{flex-shrink:0;align-items:center;gap:6px;padding-left:4px;padding-right:10px;display:inline-flex}.gengage-qna-icon-btn{cursor:pointer;background:0 0;border:none;border-radius:999px;justify-content:center;align-items:center;width:32px;height:32px;margin:0;padding:0;transition:opacity .15s,transform .15s,background-color .15s,color .15s;display:inline-flex}.gengage-qna-icon-btn svg{width:var(--_gengage-qna-action-icon-size);height:var(--_gengage-qna-action-icon-size);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:round;fill:none;transition:opacity .12s}.gengage-qna-icon-btn:hover{background:var(--_gengage-qna-action-icon-bg-hover)}.gengage-qna-icon-btn:focus-visible{outline:2px solid var(--client-focus-ring);outline-offset:1px}.gengage-qna-icon-btn--hidden{display:none}.gengage-qna-clear{color:var(--_gengage-qna-clear-color)}.gengage-qna-clear svg{stroke:currentColor}.gengage-qna-send{color:var(--_gengage-qna-send-color-disabled)}.gengage-qna-send:disabled{opacity:1;cursor:pointer}.gengage-qna-send svg{stroke:currentColor}.gengage-qna-send.gengage-qna-send--active{color:var(--_gengage-qna-send-color)}.gengage-qna-sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.gengage-qna-heading{color:var(--_gengage-text-primary);margin:0 0 6px;font-size:1.04em;font-weight:700}.gengage-qna-loading{gap:4px;padding:12px 0;display:flex}.gengage-qna-loading-dot{background:var(--client-primary);opacity:.4;border-radius:50%;width:7px;height:7px;animation:1.4s ease-in-out infinite both gengage-qna-pulse}.gengage-qna-loading-dot:first-child{animation-delay:0s}.gengage-qna-loading-dot:nth-child(2){animation-delay:.16s}.gengage-qna-loading-dot:nth-child(3){animation-delay:.32s}@keyframes gengage-qna-pulse{0%,80%,to{opacity:.4;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}@media (width<=768px){.gengage-qna-buttons{gap:10px;padding:8px 0 12px}.gengage-qna-button,.gengage-qna-cta{min-height:44px;padding:10px 16px;font-size:14px;line-height:1.2}.gengage-qna-input{font-size:16px}.gengage-qna-input-actions{gap:4px;padding-right:8px}.gengage-qna-icon-btn{width:30px;height:30px}}@media (prefers-reduced-motion:reduce){.gengage-qna-uispec>*,.gengage-qna-button,.gengage-qna-cta,.gengage-qna-send,.gengage-qna--transitioning,.gengage-qna-transition-indicator{transition:none!important;animation:none!important;transform:none!important}}.gengage-qna--transitioning{opacity:.7;pointer-events:none;transition:opacity .2s}.gengage-qna-transition-indicator{z-index:2147483647;box-sizing:border-box;color:var(--client-primary);text-align:center;pointer-events:none;background:var(--_gengage-qna-transition-overlay);-webkit-backdrop-filter:blur(4px);border-radius:inherit;justify-content:center;align-items:center;padding:16px;font-size:12px;font-weight:500;line-height:1.35;animation:.15s gengage-qna-fade-in;display:flex;position:absolute;inset:0}@keyframes gengage-qna-fade-in{0%{opacity:0}to{opacity:1}}