@gengage/assistant-fe 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +61 -0
- package/README.md +232 -0
- package/dist/assistant-fe.css +1 -0
- package/dist/chat/api.d.ts +87 -0
- package/dist/chat/api.d.ts.map +1 -0
- package/dist/chat/attachment-utils.d.ts +10 -0
- package/dist/chat/attachment-utils.d.ts.map +1 -0
- package/dist/chat/catalog.d.ts +1114 -0
- package/dist/chat/catalog.d.ts.map +1 -0
- package/dist/chat/components/AIGroupingCards.d.ts +4 -0
- package/dist/chat/components/AIGroupingCards.d.ts.map +1 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts +4 -0
- package/dist/chat/components/AISuggestedSearchCards.d.ts.map +1 -0
- package/dist/chat/components/AITopPicks.d.ts +4 -0
- package/dist/chat/components/AITopPicks.d.ts.map +1 -0
- package/dist/chat/components/CategoriesContainer.d.ts +4 -0
- package/dist/chat/components/CategoriesContainer.d.ts.map +1 -0
- package/dist/chat/components/ChatDrawer.d.ts +140 -0
- package/dist/chat/components/ChatDrawer.d.ts.map +1 -0
- package/dist/chat/components/ChoicePrompter.d.ts +16 -0
- package/dist/chat/components/ChoicePrompter.d.ts.map +1 -0
- package/dist/chat/components/ComparisonTable.d.ts +47 -0
- package/dist/chat/components/ComparisonTable.d.ts.map +1 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts +11 -0
- package/dist/chat/components/FloatingComparisonButton.d.ts.map +1 -0
- package/dist/chat/components/GroundingReviewCard.d.ts +4 -0
- package/dist/chat/components/GroundingReviewCard.d.ts.map +1 -0
- package/dist/chat/components/KvkkBanner.d.ts +6 -0
- package/dist/chat/components/KvkkBanner.d.ts.map +1 -0
- package/dist/chat/components/Launcher.d.ts +25 -0
- package/dist/chat/components/Launcher.d.ts.map +1 -0
- package/dist/chat/components/PanelTopBar.d.ts +20 -0
- package/dist/chat/components/PanelTopBar.d.ts.map +1 -0
- package/dist/chat/components/ProactivePopup.d.ts +11 -0
- package/dist/chat/components/ProactivePopup.d.ts.map +1 -0
- package/dist/chat/components/ProsAndCons.d.ts +9 -0
- package/dist/chat/components/ProsAndCons.d.ts.map +1 -0
- package/dist/chat/components/ReviewHighlights.d.ts +3 -0
- package/dist/chat/components/ReviewHighlights.d.ts.map +1 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts +23 -0
- package/dist/chat/components/ThumbnailsColumn.d.ts.map +1 -0
- package/dist/chat/components/actionClassifier.d.ts +13 -0
- package/dist/chat/components/actionClassifier.d.ts.map +1 -0
- package/dist/chat/components/productMentionLinker.d.ts +26 -0
- package/dist/chat/components/productMentionLinker.d.ts.map +1 -0
- package/dist/chat/components/renderUISpec.d.ts +15 -0
- package/dist/chat/components/renderUISpec.d.ts.map +1 -0
- package/dist/chat/components/typewriter.d.ts +25 -0
- package/dist/chat/components/typewriter.d.ts.map +1 -0
- package/dist/chat/extendedModeManager.d.ts +33 -0
- package/dist/chat/extendedModeManager.d.ts.map +1 -0
- package/dist/chat/index.d.ts +192 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/locales/en.d.ts +3 -0
- package/dist/chat/locales/en.d.ts.map +1 -0
- package/dist/chat/locales/index.d.ts +6 -0
- package/dist/chat/locales/index.d.ts.map +1 -0
- package/dist/chat/locales/tr.d.ts +3 -0
- package/dist/chat/locales/tr.d.ts.map +1 -0
- package/dist/chat/types.d.ts +212 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat.cjs +2 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.iife.js +59 -0
- package/dist/chat.iife.js.map +1 -0
- package/dist/chat.js +11 -0
- package/dist/chat.js.map +1 -0
- package/dist/common/action-router.d.ts +30 -0
- package/dist/common/action-router.d.ts.map +1 -0
- package/dist/common/activity-tracker.d.ts +38 -0
- package/dist/common/activity-tracker.d.ts.map +1 -0
- package/dist/common/analytics-events.d.ts +90 -0
- package/dist/common/analytics-events.d.ts.map +1 -0
- package/dist/common/analytics.d.ts +58 -0
- package/dist/common/analytics.d.ts.map +1 -0
- package/dist/common/api-paths.d.ts +14 -0
- package/dist/common/api-paths.d.ts.map +1 -0
- package/dist/common/client.d.ts +20 -0
- package/dist/common/client.d.ts.map +1 -0
- package/dist/common/communication-bridge.d.ts +51 -0
- package/dist/common/communication-bridge.d.ts.map +1 -0
- package/dist/common/config-schema.d.ts +241 -0
- package/dist/common/config-schema.d.ts.map +1 -0
- package/dist/common/context.d.ts +28 -0
- package/dist/common/context.d.ts.map +1 -0
- package/dist/common/customization-factories.d.ts +63 -0
- package/dist/common/customization-factories.d.ts.map +1 -0
- package/dist/common/events.d.ts +47 -0
- package/dist/common/events.d.ts.map +1 -0
- package/dist/common/global-error-toast.d.ts +6 -0
- package/dist/common/global-error-toast.d.ts.map +1 -0
- package/dist/common/index.d.ts +36 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/indexed-db.d.ts +74 -0
- package/dist/common/indexed-db.d.ts.map +1 -0
- package/dist/common/overlay.d.ts +64 -0
- package/dist/common/overlay.d.ts.map +1 -0
- package/dist/common/preflight.d.ts +12 -0
- package/dist/common/preflight.d.ts.map +1 -0
- package/dist/common/renderer/dom.d.ts +4 -0
- package/dist/common/renderer/dom.d.ts.map +1 -0
- package/dist/common/renderer/index.d.ts +5 -0
- package/dist/common/renderer/index.d.ts.map +1 -0
- package/dist/common/renderer/overrides.d.ts +24 -0
- package/dist/common/renderer/overrides.d.ts.map +1 -0
- package/dist/common/renderer/registry.d.ts +3 -0
- package/dist/common/renderer/registry.d.ts.map +1 -0
- package/dist/common/renderer/types.d.ts +20 -0
- package/dist/common/renderer/types.d.ts.map +1 -0
- package/dist/common/safe-html.d.ts +19 -0
- package/dist/common/safe-html.d.ts.map +1 -0
- package/dist/common/streaming.d.ts +32 -0
- package/dist/common/streaming.d.ts.map +1 -0
- package/dist/common/theme-utils.d.ts +16 -0
- package/dist/common/theme-utils.d.ts.map +1 -0
- package/dist/common/types.d.ts +298 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/ui-theme.d.ts +10 -0
- package/dist/common/ui-theme.d.ts.map +1 -0
- package/dist/common/uuidv7.d.ts +8 -0
- package/dist/common/uuidv7.d.ts.map +1 -0
- package/dist/common/v1-protocol-adapter.d.ts +66 -0
- package/dist/common/v1-protocol-adapter.d.ts.map +1 -0
- package/dist/common/widget-base.d.ts +75 -0
- package/dist/common/widget-base.d.ts.map +1 -0
- package/dist/common.cjs +2 -0
- package/dist/common.cjs.map +1 -0
- package/dist/common.js +584 -0
- package/dist/common.js.map +1 -0
- package/dist/index-CFA70IGF.js +3626 -0
- package/dist/index-CFA70IGF.js.map +1 -0
- package/dist/index-Dfl89zpe.cjs +13 -0
- package/dist/index-Dfl89zpe.cjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/qna/api.d.ts +22 -0
- package/dist/qna/api.d.ts.map +1 -0
- package/dist/qna/catalog.d.ts +140 -0
- package/dist/qna/catalog.d.ts.map +1 -0
- package/dist/qna/components/ButtonRow.d.ts +16 -0
- package/dist/qna/components/ButtonRow.d.ts.map +1 -0
- package/dist/qna/components/TextInput.d.ts +12 -0
- package/dist/qna/components/TextInput.d.ts.map +1 -0
- package/dist/qna/components/renderUISpec.d.ts +8 -0
- package/dist/qna/components/renderUISpec.d.ts.map +1 -0
- package/dist/qna/index.d.ts +34 -0
- package/dist/qna/index.d.ts.map +1 -0
- package/dist/qna/locales/en.d.ts +3 -0
- package/dist/qna/locales/en.d.ts.map +1 -0
- package/dist/qna/locales/index.d.ts +6 -0
- package/dist/qna/locales/index.d.ts.map +1 -0
- package/dist/qna/locales/tr.d.ts +3 -0
- package/dist/qna/locales/tr.d.ts.map +1 -0
- package/dist/qna/types.d.ts +62 -0
- package/dist/qna/types.d.ts.map +1 -0
- package/dist/qna.cjs +2 -0
- package/dist/qna.cjs.map +1 -0
- package/dist/qna.css +1 -0
- package/dist/qna.iife.js +48 -0
- package/dist/qna.iife.js.map +1 -0
- package/dist/qna.js +435 -0
- package/dist/qna.js.map +1 -0
- package/dist/simrel/api.d.ts +26 -0
- package/dist/simrel/api.d.ts.map +1 -0
- package/dist/simrel/catalog.d.ts +319 -0
- package/dist/simrel/catalog.d.ts.map +1 -0
- package/dist/simrel/components/GroupTabs.d.ts +17 -0
- package/dist/simrel/components/GroupTabs.d.ts.map +1 -0
- package/dist/simrel/components/ProductCard.d.ts +17 -0
- package/dist/simrel/components/ProductCard.d.ts.map +1 -0
- package/dist/simrel/components/ProductGrid.d.ts +17 -0
- package/dist/simrel/components/ProductGrid.d.ts.map +1 -0
- package/dist/simrel/components/renderUISpec.d.ts +8 -0
- package/dist/simrel/components/renderUISpec.d.ts.map +1 -0
- package/dist/simrel/index.d.ts +36 -0
- package/dist/simrel/index.d.ts.map +1 -0
- package/dist/simrel/locales/en.d.ts +3 -0
- package/dist/simrel/locales/en.d.ts.map +1 -0
- package/dist/simrel/locales/index.d.ts +6 -0
- package/dist/simrel/locales/index.d.ts.map +1 -0
- package/dist/simrel/locales/tr.d.ts +3 -0
- package/dist/simrel/locales/tr.d.ts.map +1 -0
- package/dist/simrel/types.d.ts +111 -0
- package/dist/simrel/types.d.ts.map +1 -0
- package/dist/simrel.cjs +2 -0
- package/dist/simrel.cjs.map +1 -0
- package/dist/simrel.css +1 -0
- package/dist/simrel.iife.js +48 -0
- package/dist/simrel.iife.js.map +1 -0
- package/dist/simrel.js +620 -0
- package/dist/simrel.js.map +1 -0
- package/dist/types-CeON7iBO.cjs +48 -0
- package/dist/types-CeON7iBO.cjs.map +1 -0
- package/dist/types-yxW8WA7u.js +4132 -0
- package/dist/types-yxW8WA7u.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simrel.cjs","sources":["../src/simrel/api.ts","../src/simrel/components/ProductCard.ts","../src/simrel/components/ProductGrid.ts","../src/simrel/components/GroupTabs.ts","../src/simrel/components/renderUISpec.ts","../src/simrel/locales/tr.ts","../src/simrel/locales/en.ts","../src/simrel/locales/index.ts","../src/simrel/catalog.ts","../src/simrel/index.ts"],"sourcesContent":["import { buildChatEndpointUrl } from '../common/api-paths.js';\nimport { consumeStream } from '../common/streaming.js';\nimport {\n adaptV1Event,\n normalizeSimilarProductsResponse,\n normalizeProductGroupingsResponse,\n} from '../common/v1-protocol-adapter.js';\nimport type { NormalizedProduct } from '../common/v1-protocol-adapter.js';\nimport type { StreamEvent } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface SimilarProductsRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n sku: string;\n domain?: string;\n limit?: number;\n output_language?: string;\n}\n\nexport interface ProductGroupingsRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n skus: string[];\n output_language?: string;\n}\n\nexport interface ProductGroup {\n name: string;\n highlight?: string;\n products: NormalizedProduct[];\n}\n\nfunction isNDJSONResponse(response: Response): boolean {\n const ct = response.headers.get('Content-Type') ?? '';\n return ct.includes('application/x-ndjson') || ct.includes('text/event-stream');\n}\n\nasync function collectProductsFromStream(response: Response, signal?: AbortSignal): Promise<NormalizedProduct[]> {\n const products: NormalizedProduct[] = [];\n const opts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n if (!normalized || normalized.type !== 'ui_spec') return;\n\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ProductCard' && el.props) {\n const product = (el.props['product'] ?? el.props) as Record<string, unknown>;\n if (typeof product['sku'] === 'string' && typeof product['name'] === 'string') {\n products.push(product as unknown as NormalizedProduct);\n }\n }\n }\n },\n };\n if (signal !== undefined) opts.signal = signal;\n await consumeStream(response, opts);\n return products;\n}\n\nexport async function fetchSimilarProducts(\n request: SimilarProductsRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<NormalizedProduct[]> {\n const url = buildChatEndpointUrl('similar_products', transport);\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 if (isNDJSONResponse(response)) {\n return collectProductsFromStream(response, signal);\n }\n\n const text = await response.text();\n if (!text) return [];\n return normalizeSimilarProductsResponse(JSON.parse(text));\n}\n\nasync function collectGroupingsFromStream(response: Response, signal?: AbortSignal): Promise<ProductGroup[]> {\n const groups: ProductGroup[] = [];\n let currentGroup: ProductGroup | null = null;\n\n const opts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n if (!normalized) return;\n\n if (normalized.type === 'metadata' && normalized.meta) {\n const name = normalized.meta['group_name'];\n if (typeof name === 'string') {\n currentGroup = { name, products: [] };\n const highlight = normalized.meta['highlight'];\n if (typeof highlight === 'string') currentGroup.highlight = highlight;\n groups.push(currentGroup);\n }\n }\n\n if (normalized.type === 'ui_spec' && currentGroup) {\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ProductCard' && el.props) {\n const product = (el.props['product'] ?? el.props) as Record<string, unknown>;\n if (typeof product['sku'] === 'string' && typeof product['name'] === 'string') {\n currentGroup.products.push(product as unknown as NormalizedProduct);\n }\n }\n }\n }\n },\n };\n if (signal !== undefined) opts.signal = signal;\n await consumeStream(response, opts);\n\n return groups;\n}\n\nexport async function fetchProductGroupings(\n request: ProductGroupingsRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<ProductGroup[]> {\n const url = buildChatEndpointUrl('product_groupings', transport);\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 if (isNDJSONResponse(response)) {\n return collectGroupingsFromStream(response, signal);\n }\n\n const text = await response.text();\n if (!text) return [];\n return normalizeProductGroupingsResponse(JSON.parse(text));\n}\n","import type { NormalizedProduct } from '../../common/v1-protocol-adapter.js';\nimport type { SimRelI18n } from '../types.js';\n\nexport interface ProductCardOptions {\n product: NormalizedProduct;\n index: number;\n discountType?: 'strike-through' | 'badge';\n onClick: (product: NormalizedProduct) => void;\n onAddToCart: (params: { sku: string; quantity: number; cartCode: string }) => void;\n renderCard?: (product: NormalizedProduct, index: number) => string;\n i18n?: SimRelI18n;\n}\n\nexport function renderProductCard(options: ProductCardOptions): HTMLElement {\n const { product, index, discountType, onClick, onAddToCart, renderCard } = options;\n const i18n = options.i18n;\n const priceSuffix = i18n?.priceSuffix ?? ' TL';\n\n // Custom card renderer (XSS warning: raw HTML injection)\n if (renderCard) {\n const wrapper = document.createElement('div');\n wrapper.className = 'gengage-simrel-card gengage-simrel-card--custom';\n // ⚠️ XSS: renderCard returns raw HTML. Caller must sanitize.\n wrapper.innerHTML = renderCard(product, index);\n wrapper.addEventListener('click', (e) => {\n if ((e.target as HTMLElement).closest('.gengage-simrel-atc')) return;\n onClick(product);\n });\n return wrapper;\n }\n\n const card = document.createElement('article');\n card.className = 'gengage-simrel-card';\n card.setAttribute('role', 'listitem');\n card.dataset['sku'] = product.sku;\n\n // Image\n const imgWrapper = document.createElement('div');\n imgWrapper.className = 'gengage-simrel-card-image';\n if (product.imageUrl) {\n const img = document.createElement('img');\n img.src = product.imageUrl;\n img.alt = product.name;\n img.loading = 'lazy';\n imgWrapper.appendChild(img);\n }\n\n // Discount badge\n if (discountType === 'badge' && product.discountPercent && product.discountPercent > 0) {\n const badge = document.createElement('span');\n badge.className = 'gengage-simrel-badge';\n badge.textContent = `%${product.discountPercent}`;\n imgWrapper.appendChild(badge);\n }\n\n card.appendChild(imgWrapper);\n\n // Info section\n const info = document.createElement('div');\n info.className = 'gengage-simrel-card-info';\n\n // Brand\n if (product.brand) {\n const brandEl = document.createElement('div');\n brandEl.className = 'gengage-simrel-card-brand';\n brandEl.textContent = product.brand;\n info.appendChild(brandEl);\n }\n\n // Name\n const nameEl = document.createElement('div');\n nameEl.className = 'gengage-simrel-card-name';\n nameEl.textContent = product.name;\n info.appendChild(nameEl);\n\n // Rating\n if (product.rating != null && product.rating > 0) {\n const ratingEl = document.createElement('div');\n ratingEl.className = 'gengage-simrel-card-rating';\n const stars = '\\u2605'.repeat(Math.round(product.rating)) + '\\u2606'.repeat(5 - Math.round(product.rating));\n ratingEl.textContent = stars;\n if (product.reviewCount != null) {\n const count = document.createElement('span');\n count.className = 'gengage-simrel-card-review-count';\n count.textContent = ` (${product.reviewCount})`;\n ratingEl.appendChild(count);\n }\n info.appendChild(ratingEl);\n }\n\n // Price\n const priceContainer = document.createElement('div');\n priceContainer.className = 'gengage-simrel-card-price';\n\n if (product.originalPrice && product.originalPrice !== product.price) {\n if (discountType === 'strike-through' || !discountType) {\n const original = document.createElement('span');\n original.className = 'gengage-simrel-card-price-original';\n original.textContent = product.originalPrice + priceSuffix;\n priceContainer.appendChild(original);\n }\n }\n\n if (product.price) {\n const current = document.createElement('span');\n current.className = 'gengage-simrel-card-price-current';\n current.textContent = product.price + priceSuffix;\n priceContainer.appendChild(current);\n }\n\n info.appendChild(priceContainer);\n card.appendChild(info);\n\n // Add to cart button\n if (product.cartCode) {\n const atcBtn = document.createElement('button');\n atcBtn.className = 'gengage-simrel-atc';\n atcBtn.type = 'button';\n atcBtn.textContent = i18n?.addToCartButton ?? 'Sepete Ekle';\n atcBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n onAddToCart({ sku: product.sku, quantity: 1, cartCode: product.cartCode! });\n });\n card.appendChild(atcBtn);\n }\n\n // Card click → navigate\n card.addEventListener('click', (e) => {\n if ((e.target as HTMLElement).closest('.gengage-simrel-atc')) return;\n onClick(product);\n });\n\n return card;\n}\n","import type { NormalizedProduct } from '../../common/v1-protocol-adapter.js';\nimport type { SimRelI18n } from '../types.js';\nimport { renderProductCard } from './ProductCard.js';\nimport type { ProductCardOptions } from './ProductCard.js';\n\nexport interface ProductGridOptions {\n products: NormalizedProduct[];\n columns?: number;\n discountType?: 'strike-through' | 'badge';\n onClick: (product: NormalizedProduct) => void;\n onAddToCart: (params: { sku: string; quantity: number; cartCode: string }) => void;\n renderCard?: (product: NormalizedProduct, index: number) => string;\n i18n?: SimRelI18n;\n}\n\nexport function renderProductGrid(options: ProductGridOptions): HTMLElement {\n const grid = document.createElement('div');\n grid.className = 'gengage-simrel-grid';\n grid.setAttribute('role', 'list');\n grid.setAttribute('aria-label', options.i18n?.similarProductsAriaLabel ?? 'Similar products');\n\n if (options.columns) {\n grid.style.setProperty('--gengage-simrel-columns', String(options.columns));\n }\n\n for (let i = 0; i < options.products.length; i++) {\n const product = options.products[i]!;\n const cardOpts: ProductCardOptions = {\n product,\n index: i,\n onClick: options.onClick,\n onAddToCart: options.onAddToCart,\n };\n if (options.i18n !== undefined) cardOpts.i18n = options.i18n;\n if (options.discountType !== undefined) cardOpts.discountType = options.discountType;\n if (options.renderCard !== undefined) cardOpts.renderCard = options.renderCard;\n const card = renderProductCard(cardOpts);\n grid.appendChild(card);\n }\n\n if (options.products.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'gengage-simrel-empty';\n empty.textContent = options.i18n?.emptyStateMessage ?? 'Benzer ürün bulunamadı.';\n grid.appendChild(empty);\n }\n\n return grid;\n}\n","import type { NormalizedProduct } from '../../common/v1-protocol-adapter.js';\nimport type { ProductGroup } from '../api.js';\nimport type { SimRelI18n } from '../types.js';\nimport { renderProductGrid } from './ProductGrid.js';\n\nexport interface GroupTabsOptions {\n groups: ProductGroup[];\n discountType?: 'strike-through' | 'badge';\n onClick: (product: NormalizedProduct) => void;\n onAddToCart: (params: { sku: string; quantity: number; cartCode: string }) => void;\n renderCard?: (product: NormalizedProduct, index: number) => string;\n i18n?: SimRelI18n;\n}\n\nexport function renderGroupTabs(options: GroupTabsOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-simrel-groups';\n\n if (options.groups.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'gengage-simrel-empty';\n empty.textContent = options.i18n?.emptyStateMessage ?? 'Benzer ürün bulunamadı.';\n container.appendChild(empty);\n return container;\n }\n\n // Tab bar\n const tabBar = document.createElement('div');\n tabBar.className = 'gengage-simrel-tabs';\n tabBar.setAttribute('role', 'tablist');\n\n // Content area\n const contentArea = document.createElement('div');\n contentArea.className = 'gengage-simrel-tab-content';\n\n for (let i = 0; i < options.groups.length; i++) {\n const group = options.groups[i]!;\n const tab = document.createElement('button');\n tab.className = 'gengage-simrel-tab';\n tab.type = 'button';\n tab.textContent = group.name;\n tab.setAttribute('role', 'tab');\n tab.setAttribute('aria-selected', i === 0 ? 'true' : 'false');\n if (i === 0) tab.classList.add('gengage-simrel-tab--active');\n\n tab.addEventListener('click', () => {\n // Deactivate previous\n const prevTab = tabBar.querySelector('.gengage-simrel-tab--active');\n prevTab?.classList.remove('gengage-simrel-tab--active');\n prevTab?.setAttribute('aria-selected', 'false');\n\n // Activate current\n tab.classList.add('gengage-simrel-tab--active');\n tab.setAttribute('aria-selected', 'true');\n\n // Render grid for this group\n contentArea.innerHTML = '';\n const gridOpts: import('./ProductGrid.js').ProductGridOptions = {\n products: group.products,\n onClick: options.onClick,\n onAddToCart: options.onAddToCart,\n };\n if (options.i18n !== undefined) gridOpts.i18n = options.i18n;\n if (options.discountType !== undefined) gridOpts.discountType = options.discountType;\n if (options.renderCard !== undefined) gridOpts.renderCard = options.renderCard;\n const grid = renderProductGrid(gridOpts);\n contentArea.appendChild(grid);\n });\n\n tabBar.appendChild(tab);\n }\n\n container.appendChild(tabBar);\n\n // Render initial tab content\n const firstGroup = options.groups[0]!;\n const initialGridOpts: import('./ProductGrid.js').ProductGridOptions = {\n products: firstGroup.products,\n onClick: options.onClick,\n onAddToCart: options.onAddToCart,\n };\n if (options.i18n !== undefined) initialGridOpts.i18n = options.i18n;\n if (options.discountType !== undefined) initialGridOpts.discountType = options.discountType;\n if (options.renderCard !== undefined) initialGridOpts.renderCard = options.renderCard;\n const initialGrid = renderProductGrid(initialGridOpts);\n contentArea.appendChild(initialGrid);\n\n container.appendChild(contentArea);\n return container;\n}\n","import { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { UISpec, ActionPayload } from '../../common/types.js';\nimport type { SimRelUISpecRenderContext, SimilarProduct } from '../types.js';\nimport type { ProductGroup } from '../api.js';\nimport { renderProductCard } from './ProductCard.js';\nimport { renderGroupTabs } from './GroupTabs.js';\n\nexport type SimRelUISpecRegistry = UISpecDomRegistry<SimRelUISpecRenderContext>;\n\nfunction toSimRelProduct(raw: unknown): SimilarProduct | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n if (typeof obj['sku'] !== 'string' || typeof obj['name'] !== 'string' || typeof obj['url'] !== 'string') {\n return null;\n }\n\n const result: SimilarProduct = {\n sku: obj['sku'],\n name: obj['name'],\n url: obj['url'],\n };\n\n const imageUrl = obj['imageUrl'];\n if (typeof imageUrl === 'string') result.imageUrl = imageUrl;\n const price = obj['price'];\n if (typeof price === 'string') result.price = price;\n const originalPrice = obj['originalPrice'];\n if (typeof originalPrice === 'string') result.originalPrice = originalPrice;\n const discountPercent = obj['discountPercent'];\n if (typeof discountPercent === 'number') result.discountPercent = discountPercent;\n const brand = obj['brand'];\n if (typeof brand === 'string') result.brand = brand;\n const rating = obj['rating'];\n if (typeof rating === 'number') result.rating = rating;\n const reviewCount = obj['reviewCount'];\n if (typeof reviewCount === 'number') result.reviewCount = reviewCount;\n const cartCode = obj['cartCode'];\n if (typeof cartCode === 'string') result.cartCode = cartCode;\n const inStock = obj['inStock'];\n if (typeof inStock === 'boolean') result.inStock = inStock;\n\n return result;\n}\n\nfunction toActionPayload(raw: unknown): ActionPayload | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const title = obj['title'];\n const type = obj['type'];\n if (typeof title !== 'string' || typeof type !== 'string') return null;\n const action: ActionPayload = { title, type };\n if (obj['payload'] !== undefined) action.payload = obj['payload'];\n return action;\n}\n\nconst DEFAULT_SIMREL_UI_SPEC_REGISTRY: SimRelUISpecRegistry = {\n ProductGrid: ({ element, renderElement }) => {\n const grid = document.createElement('div');\n grid.className = 'gengage-simrel-grid';\n grid.setAttribute('role', 'list');\n\n const columns = element.props?.['columns'];\n if (typeof columns === 'number' && Number.isFinite(columns) && columns > 0) {\n grid.style.setProperty('--gengage-simrel-columns', String(columns));\n }\n\n for (const childId of element.children ?? []) {\n const rendered = renderElement(childId);\n if (rendered) grid.appendChild(rendered);\n }\n\n if (grid.children.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'gengage-simrel-empty';\n empty.textContent = 'Benzer ürün bulunamadı.';\n grid.appendChild(empty);\n }\n\n return grid;\n },\n\n ProductCard: ({ element, context }) => {\n const productRaw = (element.props?.['product'] ?? element.props) as unknown;\n const product = toSimRelProduct(productRaw);\n if (!product) return null;\n\n const indexRaw = element.props?.['index'];\n const index = typeof indexRaw === 'number' && Number.isFinite(indexRaw) ? indexRaw : 0;\n const discountTypeRaw = element.props?.['discountType'];\n const discountType =\n discountTypeRaw === 'strike-through' || discountTypeRaw === 'badge' ? discountTypeRaw : context.discountType;\n\n const options: import('./ProductCard.js').ProductCardOptions = {\n product,\n index,\n onClick: context.onClick,\n onAddToCart: context.onAddToCart,\n i18n: context.i18n,\n };\n if (discountType !== undefined) options.discountType = discountType;\n if (context.renderCard !== undefined) options.renderCard = context.renderCard;\n return renderProductCard(options);\n },\n\n GroupTabs: ({ element, context }) => {\n const groupsRaw = element.props?.['groups'];\n if (!Array.isArray(groupsRaw)) return null;\n const groups: ProductGroup[] = [];\n\n for (const entry of groupsRaw) {\n if (!entry || typeof entry !== 'object') continue;\n const obj = entry as Record<string, unknown>;\n if (typeof obj['name'] !== 'string') continue;\n\n const products: SimilarProduct[] = [];\n if (Array.isArray(obj['products'])) {\n for (const rawProduct of obj['products']) {\n const normalized = toSimRelProduct(rawProduct);\n if (normalized) products.push(normalized);\n }\n }\n\n const group: ProductGroup = {\n name: obj['name'],\n products,\n };\n if (typeof obj['highlight'] === 'string') group.highlight = obj['highlight'];\n groups.push(group);\n }\n\n const options: import('./GroupTabs.js').GroupTabsOptions = {\n groups,\n onClick: context.onClick,\n onAddToCart: context.onAddToCart,\n i18n: context.i18n,\n };\n if (context.discountType !== undefined) options.discountType = context.discountType;\n if (context.renderCard !== undefined) options.renderCard = context.renderCard;\n return renderGroupTabs(options);\n },\n\n EmptyState: ({ element, context }) => {\n const empty = document.createElement('div');\n empty.className = 'gengage-simrel-empty';\n const message = element.props?.['message'];\n empty.textContent = typeof message === 'string' ? message : context.i18n.emptyStateMessage;\n return empty;\n },\n\n AddToCartButton: ({ element, context }) => {\n const sku = element.props?.['sku'];\n const cartCode = element.props?.['cartCode'];\n if (typeof sku !== 'string' || typeof cartCode !== 'string') return null;\n\n const button = document.createElement('button');\n button.className = 'gengage-simrel-atc';\n button.type = 'button';\n const label = element.props?.['label'];\n button.textContent = typeof label === 'string' ? label : context.i18n.addToCartButton;\n button.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n context.onAddToCart({ sku, quantity: 1, cartCode });\n });\n return button;\n },\n\n QuickActions: ({ element, context }) => {\n const wrapper = document.createElement('div');\n wrapper.className = 'gengage-simrel-quick-actions';\n const actions = element.props?.['actions'];\n if (!Array.isArray(actions) || !context.onAction) return wrapper;\n\n for (const raw of actions) {\n if (!raw || typeof raw !== 'object') continue;\n const actionObj = raw as Record<string, unknown>;\n const label = actionObj['label'];\n const action = toActionPayload(actionObj['action']);\n if (typeof label !== 'string' || !action) continue;\n\n const button = document.createElement('button');\n button.className = 'gengage-simrel-quick-action';\n button.type = 'button';\n button.textContent = label;\n button.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n context.onAction?.(action);\n });\n wrapper.appendChild(button);\n }\n return wrapper;\n },\n};\n\nexport const defaultSimRelUnknownUISpecRenderer: UISpecDomUnknownRenderer<SimRelUISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage:simrel] 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 createDefaultSimRelUISpecRegistry(): SimRelUISpecRegistry {\n return { ...DEFAULT_SIMREL_UI_SPEC_REGISTRY };\n}\n\nexport function renderSimRelUISpec(\n spec: UISpec,\n context: SimRelUISpecRenderContext,\n registry = DEFAULT_SIMREL_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<SimRelUISpecRenderContext> = defaultSimRelUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context,\n registry,\n containerClassName: 'gengage-simrel-uispec',\n unknownRenderer,\n });\n}\n","import type { SimRelI18n } from '../types.js';\n\nexport const SIMREL_I18N_TR: SimRelI18n = {\n similarProductsAriaLabel: 'Benzer ürünler',\n emptyStateMessage: 'Benzer ürün bulunamadı.',\n addToCartButton: 'Sepete Ekle',\n priceSuffix: ' TL',\n};\n","import type { SimRelI18n } from '../types.js';\n\nexport const SIMREL_I18N_EN: SimRelI18n = {\n similarProductsAriaLabel: 'Similar products',\n emptyStateMessage: 'No similar products found.',\n addToCartButton: 'Add to cart',\n priceSuffix: '',\n};\n","import type { SimRelI18n } from '../types.js';\nimport { SIMREL_I18N_TR } from './tr.js';\nimport { SIMREL_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 resolveSimRelLocale(locale?: string): SimRelI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return SIMREL_I18N_EN;\n default:\n return SIMREL_I18N_TR;\n }\n}\n\nexport { SIMREL_I18N_TR, SIMREL_I18N_EN };\n","/**\n * Similar Products (SimRel) widget — json-render catalog definition.\n *\n * Backend endpoints:\n * POST /chat/similar_products — primary product list\n * POST /chat/product_groupings — grouped/tabbed view\n *\n * The backend streams NDJSON events. `ui_spec` events reference\n * component names defined below. Implementations live in ./registry.\n */\n\nimport { z } from 'zod';\n\nconst SimilarProductSchema = z.object({\n sku: z.string(),\n name: z.string(),\n imageUrl: z.string().url().optional(),\n price: z.string().optional(),\n originalPrice: z.string().optional(),\n discountPercent: z.number().optional(),\n url: z.string().url(),\n brand: z.string().optional(),\n rating: z.number().min(0).max(5).optional(),\n reviewCount: z.number().int().nonnegative().optional(),\n});\n\nexport const ProductGridSchema = z.object({\n layout: z.enum(['grid', 'carousel']).optional(),\n columns: z.number().int().positive().optional(),\n});\n\nexport const ProductCardSchema = z.object({\n product: SimilarProductSchema,\n index: z.number().int().nonnegative(),\n discountType: z.enum(['strike-through', 'badge']).optional(),\n});\n\nexport const AddToCartButtonSchema = z.object({\n sku: z.string(),\n label: z.string().optional(),\n cartCode: z.string(),\n});\n\nexport const QuickActionsSchema = z.object({\n actions: z.array(\n z.object({\n label: z.string(),\n action: z.object({\n title: z.string(),\n type: z.string(),\n payload: z.unknown().optional(),\n }),\n }),\n ),\n});\n\nexport const EmptyStateSchema = z.object({\n message: z.string().optional(),\n});\n\nexport const simRelCatalog = {\n components: {\n ProductGrid: {\n schema: ProductGridSchema,\n description: 'Outer grid or carousel container for similar products.',\n },\n ProductCard: {\n schema: ProductCardSchema,\n description: 'A single product card with image, title, price, and actions.',\n },\n AddToCartButton: {\n schema: AddToCartButtonSchema,\n description: 'Add-to-cart CTA rendered inside or below a product card.',\n },\n QuickActions: {\n schema: QuickActionsSchema,\n description: 'A row of quick-action buttons below product info.',\n },\n EmptyState: {\n schema: EmptyStateSchema,\n description: 'Empty state shown when no similar products are available.',\n },\n },\n} as const;\n\nexport type SimRelCatalog = typeof simRelCatalog;\nexport type SimRelComponentName = keyof SimRelCatalog['components'];\n","/**\n * Similar Products (SimRel) widget — public entry point.\n *\n * Fetches and renders similar / related products for the current SKU.\n * Backend: POST /chat/similar_products + /chat/product_groupings\n */\n\nimport type { PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { NormalizedProduct } from '../common/v1-protocol-adapter.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 { getGlobalErrorMessage } from '../common/global-error-toast.js';\nimport {\n streamStartEvent,\n streamDoneEvent,\n streamErrorEvent,\n basketAddEvent,\n widgetHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { fetchSimilarProducts, fetchProductGroupings } from './api.js';\nimport {\n createDefaultSimRelUISpecRegistry,\n defaultSimRelUnknownUISpecRenderer,\n renderSimRelUISpec,\n} from './components/renderUISpec.js';\nimport type { SimRelWidgetConfig, SimilarProduct, SimRelI18n, SimRelUISpecRenderContext } from './types.js';\nimport { SIMREL_I18N_TR, resolveSimRelLocale } from './locales/index.js';\n\nimport './components/simrel.css';\n\nexport class GengageSimRel extends BaseWidget<SimRelWidgetConfig> {\n private _abortController: AbortController | null = null;\n private _contentEl: HTMLElement | null = null;\n private _lastSku: string | undefined;\n private _i18n: SimRelI18n = SIMREL_I18N_TR;\n\n protected async onInit(config: SimRelWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n\n this._contentEl = document.createElement('div');\n this._contentEl.className = 'gengage-simrel-container';\n this.root.appendChild(this._contentEl);\n\n this._lastSku = config.sku;\n await this._fetchAndRender(config.sku);\n this.isVisible = true;\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n const newSku = context.sku;\n if (!newSku || newSku === this._lastSku) return;\n this._lastSku = newSku;\n void this._fetchAndRender(newSku);\n }\n\n protected onShow(): void {\n if (this._contentEl) {\n this._contentEl.style.opacity = '0';\n this._contentEl.style.transition = 'opacity 0.3s ease-in';\n requestAnimationFrame(() => {\n if (this._contentEl) this._contentEl.style.opacity = '1';\n });\n }\n }\n\n protected onHide(): void {\n // Preserve fetched products for re-show\n }\n\n protected onDestroy(): void {\n this._abort();\n if (this._contentEl) {\n this._contentEl.remove();\n this._contentEl = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal event dispatchers\n // ---------------------------------------------------------------------------\n\n _handleProductClick(product: NormalizedProduct): void {\n const simRelProduct: SimilarProduct = {\n sku: product.sku,\n name: product.name,\n url: product.url,\n };\n if (product.imageUrl !== undefined) simRelProduct.imageUrl = product.imageUrl;\n if (product.price !== undefined) simRelProduct.price = product.price;\n if (product.originalPrice !== undefined) simRelProduct.originalPrice = product.originalPrice;\n if (product.discountPercent !== undefined) simRelProduct.discountPercent = product.discountPercent;\n if (product.brand !== undefined) simRelProduct.brand = product.brand;\n if (product.rating !== undefined) simRelProduct.rating = product.rating;\n if (product.reviewCount !== undefined) simRelProduct.reviewCount = product.reviewCount;\n if (product.cartCode !== undefined) simRelProduct.cartCode = product.cartCode;\n if (product.inStock !== undefined) simRelProduct.inStock = product.inStock;\n\n if (this.config.onProductClick?.(simRelProduct) === false) return;\n\n const sessionId = this.config.session?.sessionId ?? null;\n dispatch('gengage:similar:product-click', {\n sku: product.sku,\n url: product.url,\n sessionId,\n });\n\n this.config.onProductNavigate?.(product.url, product.sku, sessionId);\n }\n\n _handleAddToCart(params: { sku: string; quantity: number; cartCode: string }): void {\n this.config.onAddToCart?.(params);\n dispatch('gengage:similar:add-to-cart', params);\n\n this.track(\n basketAddEvent(this.analyticsContext(), {\n attribution_source: 'simrel',\n attribution_action_id: crypto.randomUUID(),\n cart_value: 0, // Host page should enrich via event listener\n currency: 'TRY',\n line_items: params.quantity,\n sku: params.sku,\n }),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private _abort(): void {\n this._abortController?.abort();\n this._abortController = null;\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 this._contentEl.innerHTML = '';\n\n // Show loading spinner\n const loading = document.createElement('div');\n loading.className = 'gengage-simrel-loading';\n const spinner = document.createElement('div');\n spinner.className = 'gengage-simrel-spinner';\n loading.appendChild(spinner);\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\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'similar_products',\n request_id: requestId,\n widget: 'simrel',\n }),\n );\n\n try {\n // Fetch similar products\n const simReq: import('./api.js').SimilarProductsRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n sku,\n };\n if (this.config.domain !== undefined) simReq.domain = this.config.domain;\n const products = await fetchSimilarProducts(simReq, transport, this._abortController.signal);\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n // Try to fetch product groupings for tabbed view\n if (products.length > 0) {\n try {\n const skus = products.map((p) => p.sku);\n const groups = await fetchProductGroupings(\n {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n skus,\n },\n transport,\n this._abortController.signal,\n );\n\n if (groups.length > 0 && this._contentEl) {\n const groupsSpec = this._buildGroupsSpec(groups);\n const renderedGroups = this._renderUISpec(groupsSpec);\n this._contentEl.appendChild(renderedGroups);\n return;\n }\n } catch {\n // Product groupings is optional; fall through to flat grid\n }\n }\n\n // Flat grid (no groupings or groupings failed)\n if (this._contentEl) {\n const gridSpec = this._buildProductsSpec(products);\n const renderedGrid = this._renderUISpec(gridSpec);\n this._contentEl.appendChild(renderedGrid);\n }\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: products.length,\n widget: 'simrel',\n }),\n );\n\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: products.length,\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'simrel',\n }),\n );\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n\n dispatch('gengage:global:error', {\n source: 'simrel',\n code: 'FETCH_ERROR',\n message: getGlobalErrorMessage(this.config.locale),\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: 'simrel',\n }),\n );\n\n if (import.meta.env?.DEV) {\n console.error('[gengage:simrel] Failed to fetch similar products:', err);\n }\n // Hide the widget gracefully — no user-facing error for backend unavailability\n if (this._contentEl) {\n this._contentEl.innerHTML = '';\n this._contentEl.style.display = 'none';\n }\n }\n }\n\n private _resolveI18n(config: SimRelWidgetConfig): SimRelI18n {\n const base = resolveSimRelLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry() {\n const baseRegistry = createDefaultSimRelUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _buildRenderContext(): SimRelUISpecRenderContext {\n const renderCard = this.config.renderCard as ((product: SimilarProduct, index: number) => string) | undefined;\n const context: SimRelUISpecRenderContext = {\n onClick: (product) => this._handleProductClick(product as unknown as NormalizedProduct),\n onAddToCart: (params) => this._handleAddToCart(params),\n i18n: this._i18n,\n };\n if (this.config.discountType !== undefined) context.discountType = this.config.discountType;\n if (renderCard !== undefined) context.renderCard = renderCard;\n return context;\n }\n\n private _renderUISpec(spec: UISpec): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const context = this._buildRenderContext();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultSimRelUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: SimRelUISpecRenderContext) =>\n renderSimRelUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<SimRelUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n\n private _buildProductsSpec(products: NormalizedProduct[]): UISpec {\n const elements: Record<string, UIElement> = {};\n const children: string[] = [];\n for (let i = 0; i < products.length; i++) {\n const product = products[i]!;\n const id = `product-${i}`;\n children.push(id);\n elements[id] = {\n type: 'ProductCard',\n props: {\n product,\n index: i,\n discountType: this.config.discountType,\n },\n };\n }\n elements['root'] = {\n type: 'ProductGrid',\n props: {\n layout: 'grid',\n },\n children,\n };\n return {\n root: 'root',\n elements,\n };\n }\n\n private _buildGroupsSpec(\n groups: Array<{\n name: string;\n highlight?: string;\n products: NormalizedProduct[];\n }>,\n ): UISpec {\n return {\n root: 'root',\n elements: {\n root: {\n type: 'GroupTabs',\n props: { groups },\n },\n },\n };\n }\n}\n\nexport function createSimRelWidget(): GengageSimRel {\n return new GengageSimRel();\n}\n\nexport type {\n SimRelWidgetConfig,\n SimilarProduct,\n SimRelUIComponents,\n SimRelI18n,\n SimRelUISpecRenderContext,\n SimRelRendererConfig,\n} from './types.js';\nexport {\n renderSimRelUISpec,\n createDefaultSimRelUISpecRegistry,\n defaultSimRelUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { SimRelUISpecRegistry } from './components/renderUISpec.js';\nexport { simRelCatalog } from './catalog.js';\nexport type { SimRelCatalog, SimRelComponentName } from './catalog.js';\n"],"names":["isNDJSONResponse","response","ct","collectProductsFromStream","signal","products","opts","event","normalized","adaptV1Event","el","product","consumeStream","fetchSimilarProducts","request","transport","url","buildChatEndpointUrl","fetchInit","text","normalizeSimilarProductsResponse","collectGroupingsFromStream","groups","currentGroup","name","highlight","fetchProductGroupings","normalizeProductGroupingsResponse","renderProductCard","options","index","discountType","onClick","onAddToCart","renderCard","i18n","priceSuffix","wrapper","e","card","imgWrapper","img","badge","info","brandEl","nameEl","ratingEl","stars","count","priceContainer","original","current","atcBtn","renderProductGrid","grid","i","cardOpts","empty","renderGroupTabs","container","tabBar","contentArea","group","tab","prevTab","gridOpts","initialGridOpts","initialGrid","toSimRelProduct","raw","obj","result","imageUrl","price","originalPrice","discountPercent","brand","rating","reviewCount","cartCode","inStock","toActionPayload","title","type","action","DEFAULT_SIMREL_UI_SPEC_REGISTRY","element","renderElement","columns","childId","rendered","context","productRaw","indexRaw","discountTypeRaw","groupsRaw","entry","rawProduct","message","sku","button","label","actions","actionObj","defaultSimRelUnknownUISpecRenderer","createDefaultSimRelUISpecRegistry","renderSimRelUISpec","spec","registry","unknownRenderer","renderUISpecWithRegistry","SIMREL_I18N_TR","SIMREL_I18N_EN","normalizeLocale","locale","resolveSimRelLocale","SimilarProductSchema","z.object","z.string","z.number","ProductGridSchema","z.enum","ProductCardSchema","AddToCartButtonSchema","QuickActionsSchema","z.array","z.unknown","EmptyStateSchema","simRelCatalog","GengageSimRel","BaseWidget","config","newSku","simRelProduct","sessionId","dispatch","params","basketAddEvent","loading","spinner","requestId","fetchStart","streamStartEvent","simReq","skus","p","groupsSpec","renderedGroups","gridSpec","renderedGrid","streamDoneEvent","widgetHistorySnapshotEvent","err","getGlobalErrorMessage","streamErrorEvent","baseRegistry","mergeUISpecRegistry","defaultRender","inputSpec","inputContext","override","elements","children","id","createSimRelWidget"],"mappings":"wHAmCA,SAASA,EAAiBC,EAA6B,CACrD,MAAMC,EAAKD,EAAS,QAAQ,IAAI,cAAc,GAAK,GACnD,OAAOC,EAAG,SAAS,sBAAsB,GAAKA,EAAG,SAAS,mBAAmB,CAC/E,CAEA,eAAeC,EAA0BF,EAAoBG,EAAoD,CAC/G,MAAMC,EAAgC,CAAA,EAChCC,EAAuD,CAC3D,QAAUC,GAAuB,CAC/B,MAAMC,EAAaC,EAAAA,aAAaF,CAA2C,EAC3E,GAAI,GAACC,GAAcA,EAAW,OAAS,YAEvC,UAAWE,KAAM,OAAO,OAAOF,EAAW,KAAK,QAAQ,EACrD,GAAIE,EAAG,OAAS,eAAiBA,EAAG,MAAO,CACzC,MAAMC,EAAWD,EAAG,MAAM,SAAcA,EAAG,MACvC,OAAOC,EAAQ,KAAW,UAAY,OAAOA,EAAQ,MAAY,UACnEN,EAAS,KAAKM,CAAuC,CAEzD,EAEJ,CAAA,EAEF,OAAIP,IAAW,SAAWE,EAAK,OAASF,GACxC,MAAMQ,EAAAA,cAAcX,EAAUK,CAAI,EAC3BD,CACT,CAEA,eAAsBQ,EACpBC,EACAC,EACAX,EAC8B,CAC9B,MAAMY,EAAMC,EAAAA,qBAAqB,mBAAoBF,CAAS,EAExDG,EAAyB,CAC7B,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAM,KAAK,UAAUJ,CAAO,CAAA,EAE1BV,IAAW,SAAWc,EAAU,OAASd,GAC7C,MAAMH,EAAW,MAAM,MAAMe,EAAKE,CAAS,EAE3C,GAAI,CAACjB,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,EAGnE,GAAID,EAAiBC,CAAQ,EAC3B,OAAOE,EAA0BF,EAAUG,CAAM,EAGnD,MAAMe,EAAO,MAAMlB,EAAS,KAAA,EAC5B,OAAKkB,EACEC,mCAAiC,KAAK,MAAMD,CAAI,CAAC,EADtC,CAAA,CAEpB,CAEA,eAAeE,EAA2BpB,EAAoBG,EAA+C,CAC3G,MAAMkB,EAAyB,CAAA,EAC/B,IAAIC,EAAoC,KAExC,MAAMjB,EAAuD,CAC3D,QAAUC,GAAuB,CAC/B,MAAMC,EAAaC,EAAAA,aAAaF,CAA2C,EAC3E,GAAKC,EAEL,IAAIA,EAAW,OAAS,YAAcA,EAAW,KAAM,CACrD,MAAMgB,EAAOhB,EAAW,KAAK,WAC7B,GAAI,OAAOgB,GAAS,SAAU,CAC5BD,EAAe,CAAE,KAAAC,EAAM,SAAU,EAAC,EAClC,MAAMC,EAAYjB,EAAW,KAAK,UAC9B,OAAOiB,GAAc,WAAUF,EAAa,UAAYE,GAC5DH,EAAO,KAAKC,CAAY,CAC1B,CACF,CAEA,GAAIf,EAAW,OAAS,WAAae,GACnC,UAAWb,KAAM,OAAO,OAAOF,EAAW,KAAK,QAAQ,EACrD,GAAIE,EAAG,OAAS,eAAiBA,EAAG,MAAO,CACzC,MAAMC,EAAWD,EAAG,MAAM,SAAcA,EAAG,MACvC,OAAOC,EAAQ,KAAW,UAAY,OAAOA,EAAQ,MAAY,UACnEY,EAAa,SAAS,KAAKZ,CAAuC,CAEtE,GAGN,CAAA,EAEF,OAAIP,IAAW,SAAWE,EAAK,OAASF,GACxC,MAAMQ,EAAAA,cAAcX,EAAUK,CAAI,EAE3BgB,CACT,CAEA,eAAsBI,EACpBZ,EACAC,EACAX,EACyB,CACzB,MAAMY,EAAMC,EAAAA,qBAAqB,oBAAqBF,CAAS,EAEzDG,EAAyB,CAC7B,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAM,KAAK,UAAUJ,CAAO,CAAA,EAE1BV,IAAW,SAAWc,EAAU,OAASd,GAC7C,MAAMH,EAAW,MAAM,MAAMe,EAAKE,CAAS,EAE3C,GAAI,CAACjB,EAAS,GACZ,MAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,EAGnE,GAAID,EAAiBC,CAAQ,EAC3B,OAAOoB,EAA2BpB,EAAUG,CAAM,EAGpD,MAAMe,EAAO,MAAMlB,EAAS,KAAA,EAC5B,OAAKkB,EACEQ,oCAAkC,KAAK,MAAMR,CAAI,CAAC,EADvC,CAAA,CAEpB,CC5IO,SAASS,EAAkBC,EAA0C,CAC1E,KAAM,CAAE,QAAAlB,EAAS,MAAAmB,EAAO,aAAAC,EAAc,QAAAC,EAAS,YAAAC,EAAa,WAAAC,GAAeL,EACrEM,EAAON,EAAQ,KACfO,EAAcD,GAAM,aAAe,MAGzC,GAAID,EAAY,CACd,MAAMG,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,UAAY,kDAEpBA,EAAQ,UAAYH,EAAWvB,EAASmB,CAAK,EAC7CO,EAAQ,iBAAiB,QAAUC,GAAM,CAClCA,EAAE,OAAuB,QAAQ,qBAAqB,GAC3DN,EAAQrB,CAAO,CACjB,CAAC,EACM0B,CACT,CAEA,MAAME,EAAO,SAAS,cAAc,SAAS,EAC7CA,EAAK,UAAY,sBACjBA,EAAK,aAAa,OAAQ,UAAU,EACpCA,EAAK,QAAQ,IAAS5B,EAAQ,IAG9B,MAAM6B,EAAa,SAAS,cAAc,KAAK,EAE/C,GADAA,EAAW,UAAY,4BACnB7B,EAAQ,SAAU,CACpB,MAAM8B,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,IAAM9B,EAAQ,SAClB8B,EAAI,IAAM9B,EAAQ,KAClB8B,EAAI,QAAU,OACdD,EAAW,YAAYC,CAAG,CAC5B,CAGA,GAAIV,IAAiB,SAAWpB,EAAQ,iBAAmBA,EAAQ,gBAAkB,EAAG,CACtF,MAAM+B,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,uBAClBA,EAAM,YAAc,IAAI/B,EAAQ,eAAe,GAC/C6B,EAAW,YAAYE,CAAK,CAC9B,CAEAH,EAAK,YAAYC,CAAU,EAG3B,MAAMG,EAAO,SAAS,cAAc,KAAK,EAIzC,GAHAA,EAAK,UAAY,2BAGbhC,EAAQ,MAAO,CACjB,MAAMiC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,4BACpBA,EAAQ,YAAcjC,EAAQ,MAC9BgC,EAAK,YAAYC,CAAO,CAC1B,CAGA,MAAMC,EAAS,SAAS,cAAc,KAAK,EAM3C,GALAA,EAAO,UAAY,2BACnBA,EAAO,YAAclC,EAAQ,KAC7BgC,EAAK,YAAYE,CAAM,EAGnBlC,EAAQ,QAAU,MAAQA,EAAQ,OAAS,EAAG,CAChD,MAAMmC,EAAW,SAAS,cAAc,KAAK,EAC7CA,EAAS,UAAY,6BACrB,MAAMC,EAAQ,IAAS,OAAO,KAAK,MAAMpC,EAAQ,MAAM,CAAC,EAAI,IAAS,OAAO,EAAI,KAAK,MAAMA,EAAQ,MAAM,CAAC,EAE1G,GADAmC,EAAS,YAAcC,EACnBpC,EAAQ,aAAe,KAAM,CAC/B,MAAMqC,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,mCAClBA,EAAM,YAAc,KAAKrC,EAAQ,WAAW,IAC5CmC,EAAS,YAAYE,CAAK,CAC5B,CACAL,EAAK,YAAYG,CAAQ,CAC3B,CAGA,MAAMG,EAAiB,SAAS,cAAc,KAAK,EAGnD,GAFAA,EAAe,UAAY,4BAEvBtC,EAAQ,eAAiBA,EAAQ,gBAAkBA,EAAQ,QACzDoB,IAAiB,kBAAoB,CAACA,GAAc,CACtD,MAAMmB,EAAW,SAAS,cAAc,MAAM,EAC9CA,EAAS,UAAY,qCACrBA,EAAS,YAAcvC,EAAQ,cAAgByB,EAC/Ca,EAAe,YAAYC,CAAQ,CACrC,CAGF,GAAIvC,EAAQ,MAAO,CACjB,MAAMwC,EAAU,SAAS,cAAc,MAAM,EAC7CA,EAAQ,UAAY,oCACpBA,EAAQ,YAAcxC,EAAQ,MAAQyB,EACtCa,EAAe,YAAYE,CAAO,CACpC,CAMA,GAJAR,EAAK,YAAYM,CAAc,EAC/BV,EAAK,YAAYI,CAAI,EAGjBhC,EAAQ,SAAU,CACpB,MAAMyC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,UAAY,qBACnBA,EAAO,KAAO,SACdA,EAAO,YAAcjB,GAAM,iBAAmB,cAC9CiB,EAAO,iBAAiB,QAAUd,GAAM,CACtCA,EAAE,gBAAA,EACFL,EAAY,CAAE,IAAKtB,EAAQ,IAAK,SAAU,EAAG,SAAUA,EAAQ,SAAW,CAC5E,CAAC,EACD4B,EAAK,YAAYa,CAAM,CACzB,CAGA,OAAAb,EAAK,iBAAiB,QAAUD,GAAM,CAC/BA,EAAE,OAAuB,QAAQ,qBAAqB,GAC3DN,EAAQrB,CAAO,CACjB,CAAC,EAEM4B,CACT,CCtHO,SAASc,EAAkBxB,EAA0C,CAC1E,MAAMyB,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,sBACjBA,EAAK,aAAa,OAAQ,MAAM,EAChCA,EAAK,aAAa,aAAczB,EAAQ,MAAM,0BAA4B,kBAAkB,EAExFA,EAAQ,SACVyB,EAAK,MAAM,YAAY,2BAA4B,OAAOzB,EAAQ,OAAO,CAAC,EAG5E,QAAS0B,EAAI,EAAGA,EAAI1B,EAAQ,SAAS,OAAQ0B,IAAK,CAEhD,MAAMC,EAA+B,CACnC,QAFc3B,EAAQ,SAAS0B,CAAC,EAGhC,MAAOA,EACP,QAAS1B,EAAQ,QACjB,YAAaA,EAAQ,WAAA,EAEnBA,EAAQ,OAAS,SAAW2B,EAAS,KAAO3B,EAAQ,MACpDA,EAAQ,eAAiB,SAAW2B,EAAS,aAAe3B,EAAQ,cACpEA,EAAQ,aAAe,SAAW2B,EAAS,WAAa3B,EAAQ,YACpE,MAAMU,EAAOX,EAAkB4B,CAAQ,EACvCF,EAAK,YAAYf,CAAI,CACvB,CAEA,GAAIV,EAAQ,SAAS,SAAW,EAAG,CACjC,MAAM4B,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,uBAClBA,EAAM,YAAc5B,EAAQ,MAAM,mBAAqB,0BACvDyB,EAAK,YAAYG,CAAK,CACxB,CAEA,OAAOH,CACT,CClCO,SAASI,EAAgB7B,EAAwC,CACtE,MAAM8B,EAAY,SAAS,cAAc,KAAK,EAG9C,GAFAA,EAAU,UAAY,wBAElB9B,EAAQ,OAAO,SAAW,EAAG,CAC/B,MAAM4B,EAAQ,SAAS,cAAc,KAAK,EAC1C,OAAAA,EAAM,UAAY,uBAClBA,EAAM,YAAc5B,EAAQ,MAAM,mBAAqB,0BACvD8B,EAAU,YAAYF,CAAK,EACpBE,CACT,CAGA,MAAMC,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,UAAY,sBACnBA,EAAO,aAAa,OAAQ,SAAS,EAGrC,MAAMC,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,6BAExB,QAASN,EAAI,EAAGA,EAAI1B,EAAQ,OAAO,OAAQ0B,IAAK,CAC9C,MAAMO,EAAQjC,EAAQ,OAAO0B,CAAC,EACxBQ,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,UAAY,qBAChBA,EAAI,KAAO,SACXA,EAAI,YAAcD,EAAM,KACxBC,EAAI,aAAa,OAAQ,KAAK,EAC9BA,EAAI,aAAa,gBAAiBR,IAAM,EAAI,OAAS,OAAO,EACxDA,IAAM,GAAGQ,EAAI,UAAU,IAAI,4BAA4B,EAE3DA,EAAI,iBAAiB,QAAS,IAAM,CAElC,MAAMC,EAAUJ,EAAO,cAAc,6BAA6B,EAClEI,GAAS,UAAU,OAAO,4BAA4B,EACtDA,GAAS,aAAa,gBAAiB,OAAO,EAG9CD,EAAI,UAAU,IAAI,4BAA4B,EAC9CA,EAAI,aAAa,gBAAiB,MAAM,EAGxCF,EAAY,UAAY,GACxB,MAAMI,EAA0D,CAC9D,SAAUH,EAAM,SAChB,QAASjC,EAAQ,QACjB,YAAaA,EAAQ,WAAA,EAEnBA,EAAQ,OAAS,SAAWoC,EAAS,KAAOpC,EAAQ,MACpDA,EAAQ,eAAiB,SAAWoC,EAAS,aAAepC,EAAQ,cACpEA,EAAQ,aAAe,SAAWoC,EAAS,WAAapC,EAAQ,YACpE,MAAMyB,EAAOD,EAAkBY,CAAQ,EACvCJ,EAAY,YAAYP,CAAI,CAC9B,CAAC,EAEDM,EAAO,YAAYG,CAAG,CACxB,CAEAJ,EAAU,YAAYC,CAAM,EAI5B,MAAMM,EAAiE,CACrE,SAFiBrC,EAAQ,OAAO,CAAC,EAEZ,SACrB,QAASA,EAAQ,QACjB,YAAaA,EAAQ,WAAA,EAEnBA,EAAQ,OAAS,SAAWqC,EAAgB,KAAOrC,EAAQ,MAC3DA,EAAQ,eAAiB,SAAWqC,EAAgB,aAAerC,EAAQ,cAC3EA,EAAQ,aAAe,SAAWqC,EAAgB,WAAarC,EAAQ,YAC3E,MAAMsC,EAAcd,EAAkBa,CAAe,EACrD,OAAAL,EAAY,YAAYM,CAAW,EAEnCR,EAAU,YAAYE,CAAW,EAC1BF,CACT,CC/EA,SAASS,EAAgBC,EAAqC,CAC5D,GAAI,CAACA,GAAO,OAAOA,GAAQ,SAAU,OAAO,KAC5C,MAAMC,EAAMD,EACZ,GAAI,OAAOC,EAAI,KAAW,UAAY,OAAOA,EAAI,MAAY,UAAY,OAAOA,EAAI,KAAW,SAC7F,OAAO,KAGT,MAAMC,EAAyB,CAC7B,IAAKD,EAAI,IACT,KAAMA,EAAI,KACV,IAAKA,EAAI,GAAK,EAGVE,EAAWF,EAAI,SACjB,OAAOE,GAAa,WAAUD,EAAO,SAAWC,GACpD,MAAMC,EAAQH,EAAI,MACd,OAAOG,GAAU,WAAUF,EAAO,MAAQE,GAC9C,MAAMC,EAAgBJ,EAAI,cACtB,OAAOI,GAAkB,WAAUH,EAAO,cAAgBG,GAC9D,MAAMC,EAAkBL,EAAI,gBACxB,OAAOK,GAAoB,WAAUJ,EAAO,gBAAkBI,GAClE,MAAMC,EAAQN,EAAI,MACd,OAAOM,GAAU,WAAUL,EAAO,MAAQK,GAC9C,MAAMC,EAASP,EAAI,OACf,OAAOO,GAAW,WAAUN,EAAO,OAASM,GAChD,MAAMC,EAAcR,EAAI,YACpB,OAAOQ,GAAgB,WAAUP,EAAO,YAAcO,GAC1D,MAAMC,EAAWT,EAAI,SACjB,OAAOS,GAAa,WAAUR,EAAO,SAAWQ,GACpD,MAAMC,EAAUV,EAAI,QACpB,OAAI,OAAOU,GAAY,YAAWT,EAAO,QAAUS,GAE5CT,CACT,CAEA,SAASU,EAAgBZ,EAAoC,CAC3D,GAAI,CAACA,GAAO,OAAOA,GAAQ,SAAU,OAAO,KAC5C,MAAMC,EAAMD,EACNa,EAAQZ,EAAI,MACZa,EAAOb,EAAI,KACjB,GAAI,OAAOY,GAAU,UAAY,OAAOC,GAAS,SAAU,OAAO,KAClE,MAAMC,EAAwB,CAAE,MAAAF,EAAO,KAAAC,CAAA,EACvC,OAAIb,EAAI,UAAe,SAAWc,EAAO,QAAUd,EAAI,SAChDc,CACT,CAEA,MAAMC,EAAwD,CAC5D,YAAa,CAAC,CAAE,QAAAC,EAAS,cAAAC,KAAoB,CAC3C,MAAMjC,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,sBACjBA,EAAK,aAAa,OAAQ,MAAM,EAEhC,MAAMkC,EAAUF,EAAQ,OAAQ,QAC5B,OAAOE,GAAY,UAAY,OAAO,SAASA,CAAO,GAAKA,EAAU,GACvElC,EAAK,MAAM,YAAY,2BAA4B,OAAOkC,CAAO,CAAC,EAGpE,UAAWC,KAAWH,EAAQ,UAAY,CAAA,EAAI,CAC5C,MAAMI,EAAWH,EAAcE,CAAO,EAClCC,GAAUpC,EAAK,YAAYoC,CAAQ,CACzC,CAEA,GAAIpC,EAAK,SAAS,SAAW,EAAG,CAC9B,MAAMG,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,uBAClBA,EAAM,YAAc,0BACpBH,EAAK,YAAYG,CAAK,CACxB,CAEA,OAAOH,CACT,EAEA,YAAa,CAAC,CAAE,QAAAgC,EAAS,QAAAK,KAAc,CACrC,MAAMC,EAAcN,EAAQ,OAAQ,SAAcA,EAAQ,MACpD3E,EAAUyD,EAAgBwB,CAAU,EAC1C,GAAI,CAACjF,EAAS,OAAO,KAErB,MAAMkF,EAAWP,EAAQ,OAAQ,MAC3BxD,EAAQ,OAAO+D,GAAa,UAAY,OAAO,SAASA,CAAQ,EAAIA,EAAW,EAC/EC,EAAkBR,EAAQ,OAAQ,aAClCvD,EACJ+D,IAAoB,kBAAoBA,IAAoB,QAAUA,EAAkBH,EAAQ,aAE5F9D,EAAyD,CAC7D,QAAAlB,EACA,MAAAmB,EACA,QAAS6D,EAAQ,QACjB,YAAaA,EAAQ,YACrB,KAAMA,EAAQ,IAAA,EAEhB,OAAI5D,IAAiB,SAAWF,EAAQ,aAAeE,GACnD4D,EAAQ,aAAe,SAAW9D,EAAQ,WAAa8D,EAAQ,YAC5D/D,EAAkBC,CAAO,CAClC,EAEA,UAAW,CAAC,CAAE,QAAAyD,EAAS,QAAAK,KAAc,CACnC,MAAMI,EAAYT,EAAQ,OAAQ,OAClC,GAAI,CAAC,MAAM,QAAQS,CAAS,EAAG,OAAO,KACtC,MAAMzE,EAAyB,CAAA,EAE/B,UAAW0E,KAASD,EAAW,CAC7B,GAAI,CAACC,GAAS,OAAOA,GAAU,SAAU,SACzC,MAAM1B,EAAM0B,EACZ,GAAI,OAAO1B,EAAI,MAAY,SAAU,SAErC,MAAMjE,EAA6B,CAAA,EACnC,GAAI,MAAM,QAAQiE,EAAI,QAAW,EAC/B,UAAW2B,KAAc3B,EAAI,SAAa,CACxC,MAAM9D,EAAa4D,EAAgB6B,CAAU,EACzCzF,GAAYH,EAAS,KAAKG,CAAU,CAC1C,CAGF,MAAMsD,EAAsB,CAC1B,KAAMQ,EAAI,KACV,SAAAjE,CAAA,EAEE,OAAOiE,EAAI,WAAiB,WAAUR,EAAM,UAAYQ,EAAI,WAChEhD,EAAO,KAAKwC,CAAK,CACnB,CAEA,MAAMjC,EAAqD,CACzD,OAAAP,EACA,QAASqE,EAAQ,QACjB,YAAaA,EAAQ,YACrB,KAAMA,EAAQ,IAAA,EAEhB,OAAIA,EAAQ,eAAiB,SAAW9D,EAAQ,aAAe8D,EAAQ,cACnEA,EAAQ,aAAe,SAAW9D,EAAQ,WAAa8D,EAAQ,YAC5DjC,EAAgB7B,CAAO,CAChC,EAEA,WAAY,CAAC,CAAE,QAAAyD,EAAS,QAAAK,KAAc,CACpC,MAAMlC,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,uBAClB,MAAMyC,EAAUZ,EAAQ,OAAQ,QAChC,OAAA7B,EAAM,YAAc,OAAOyC,GAAY,SAAWA,EAAUP,EAAQ,KAAK,kBAClElC,CACT,EAEA,gBAAiB,CAAC,CAAE,QAAA6B,EAAS,QAAAK,KAAc,CACzC,MAAMQ,EAAMb,EAAQ,OAAQ,IACtBP,EAAWO,EAAQ,OAAQ,SACjC,GAAI,OAAOa,GAAQ,UAAY,OAAOpB,GAAa,SAAU,OAAO,KAEpE,MAAMqB,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,UAAY,qBACnBA,EAAO,KAAO,SACd,MAAMC,EAAQf,EAAQ,OAAQ,MAC9B,OAAAc,EAAO,YAAc,OAAOC,GAAU,SAAWA,EAAQV,EAAQ,KAAK,gBACtES,EAAO,iBAAiB,QAAU9D,GAAM,CACtCA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFqD,EAAQ,YAAY,CAAE,IAAAQ,EAAK,SAAU,EAAG,SAAApB,EAAU,CACpD,CAAC,EACMqB,CACT,EAEA,aAAc,CAAC,CAAE,QAAAd,EAAS,QAAAK,KAAc,CACtC,MAAMtD,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,+BACpB,MAAMiE,EAAUhB,EAAQ,OAAQ,QAChC,GAAI,CAAC,MAAM,QAAQgB,CAAO,GAAK,CAACX,EAAQ,SAAU,OAAOtD,EAEzD,UAAWgC,KAAOiC,EAAS,CACzB,GAAI,CAACjC,GAAO,OAAOA,GAAQ,SAAU,SACrC,MAAMkC,EAAYlC,EACZgC,EAAQE,EAAU,MAClBnB,EAASH,EAAgBsB,EAAU,MAAS,EAClD,GAAI,OAAOF,GAAU,UAAY,CAACjB,EAAQ,SAE1C,MAAMgB,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,UAAY,8BACnBA,EAAO,KAAO,SACdA,EAAO,YAAcC,EACrBD,EAAO,iBAAiB,QAAU9D,GAAM,CACtCA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFqD,EAAQ,WAAWP,CAAM,CAC3B,CAAC,EACD/C,EAAQ,YAAY+D,CAAM,CAC5B,CACA,OAAO/D,CACT,CACF,EAEamE,EAA0F,CAAC,CACtG,QAAAlB,EACA,cAAAC,CACF,IAAM,CAIJ,GAAI,CAACD,EAAQ,UAAYA,EAAQ,SAAS,SAAW,EACnD,OAAO,KAET,MAAMjD,EAAU,SAAS,cAAc,KAAK,EAC5C,UAAWoD,KAAWH,EAAQ,SAAU,CACtC,MAAMI,EAAWH,EAAcE,CAAO,EAClCC,GAAUrD,EAAQ,YAAYqD,CAAQ,CAC5C,CACA,OAAOrD,CACT,EAEO,SAASoE,GAA0D,CACxE,MAAO,CAAE,GAAGpB,CAAA,CACd,CAEO,SAASqB,EACdC,EACAhB,EACAiB,EAAWvB,EACXwB,EAAuEL,EAC1D,CACb,OAAOM,2BAAyB,CAC9B,KAAAH,EACA,QAAAhB,EACA,SAAAiB,EACA,mBAAoB,wBACpB,gBAAAC,CAAA,CACD,CACH,CCrOO,MAAME,EAA6B,CACxC,yBAA0B,iBAC1B,kBAAmB,0BACnB,gBAAiB,cACjB,YAAa,KACf,ECLaC,EAA6B,CACxC,yBAA0B,mBAC1B,kBAAmB,6BACnB,gBAAiB,cACjB,YAAa,EACf,ECHA,SAASC,EAAgBC,EAAyB,CAChD,OAAKA,EACEA,EAAO,cAAc,MAAM,GAAG,EAAE,CAAC,GAAK,KADzB,IAEtB,CAEO,SAASC,EAAoBD,EAA6B,CAC/D,OAAQD,EAAgBC,CAAM,IACvB,KACIF,EAEAD,CAEb,CCHA,MAAMK,EAAuBC,EAAAA,WAAS,CACpC,IAAKC,EAAAA,WAAE,EACP,KAAMA,EAAAA,WAAE,EACR,SAAUA,EAAAA,WAAE,EAAS,IAAA,EAAM,SAAA,EAC3B,MAAOA,EAAAA,WAAE,EAAS,SAAA,EAClB,cAAeA,EAAAA,WAAE,EAAS,SAAA,EAC1B,gBAAiBC,EAAAA,WAAE,EAAS,SAAA,EAC5B,IAAKD,EAAAA,WAAE,EAAS,IAAA,EAChB,MAAOA,EAAAA,WAAE,EAAS,SAAA,EAClB,OAAQC,EAAAA,WAAE,EAAS,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAA,EACjC,YAAaA,EAAAA,WAAE,EAAS,MAAM,YAAA,EAAc,SAAA,CAC9C,CAAC,EAEYC,EAAoBH,EAAAA,WAAS,CACxC,OAAQI,EAAAA,SAAO,CAAC,OAAQ,UAAU,CAAC,EAAE,SAAA,EACrC,QAASF,EAAAA,WAAE,EAAS,MAAM,SAAA,EAAW,SAAA,CACvC,CAAC,EAEYG,EAAoBL,EAAAA,WAAS,CACxC,QAASD,EACT,MAAOG,EAAAA,WAAE,EAAS,IAAA,EAAM,YAAA,EACxB,aAAcE,EAAAA,SAAO,CAAC,iBAAkB,OAAO,CAAC,EAAE,SAAA,CACpD,CAAC,EAEYE,EAAwBN,EAAAA,WAAS,CAC5C,IAAKC,EAAAA,WAAE,EACP,MAAOA,EAAAA,WAAE,EAAS,SAAA,EAClB,SAAUA,EAAAA,WAAE,CACd,CAAC,EAEYM,EAAqBP,EAAAA,WAAS,CACzC,QAASQ,EAAAA,UACPR,aAAS,CACP,MAAOC,EAAAA,WAAE,EACT,OAAQD,EAAAA,WAAS,CACf,MAAOC,EAAAA,WAAE,EACT,KAAMA,EAAAA,WAAE,EACR,QAASQ,EAAAA,YAAE,EAAU,SAAA,CAAS,CAC/B,CAAA,CACF,CAAA,CAEL,CAAC,EAEYC,EAAmBV,EAAAA,WAAS,CACvC,QAASC,EAAAA,WAAE,EAAS,SAAA,CACtB,CAAC,EAEYU,EAAgB,CAC3B,WAAY,CACV,YAAa,CACX,OAAQR,EACR,YAAa,wDAAA,EAEf,YAAa,CACX,OAAQE,EACR,YAAa,8DAAA,EAEf,gBAAiB,CACf,OAAQC,EACR,YAAa,0DAAA,EAEf,aAAc,CACZ,OAAQC,EACR,YAAa,mDAAA,EAEf,WAAY,CACV,OAAQG,EACR,YAAa,2DAAA,CACf,CAEJ,EClDO,MAAME,UAAsBC,EAAAA,UAA+B,CAA3D,aAAA,CAAA,MAAA,GAAA,SAAA,EACL,KAAQ,iBAA2C,KACnD,KAAQ,WAAiC,KAEzC,KAAQ,MAAoBnB,CAAA,CAE5B,MAAgB,OAAOoB,EAA2C,CAChE,KAAK,MAAQ,KAAK,aAAaA,CAAM,EAErC,KAAK,WAAa,SAAS,cAAc,KAAK,EAC9C,KAAK,WAAW,UAAY,2BAC5B,KAAK,KAAK,YAAY,KAAK,UAAU,EAErC,KAAK,SAAWA,EAAO,IACvB,MAAM,KAAK,gBAAgBA,EAAO,GAAG,EACrC,KAAK,UAAY,EACnB,CAEU,SAASxC,EAAqC,CACtD,MAAMyC,EAASzC,EAAQ,IACnB,CAACyC,GAAUA,IAAW,KAAK,WAC/B,KAAK,SAAWA,EACX,KAAK,gBAAgBA,CAAM,EAClC,CAEU,QAAe,CACnB,KAAK,aACP,KAAK,WAAW,MAAM,QAAU,IAChC,KAAK,WAAW,MAAM,WAAa,uBACnC,sBAAsB,IAAM,CACtB,KAAK,aAAY,KAAK,WAAW,MAAM,QAAU,IACvD,CAAC,EAEL,CAEU,QAAe,CAEzB,CAEU,WAAkB,CAC1B,KAAK,OAAA,EACD,KAAK,aACP,KAAK,WAAW,OAAA,EAChB,KAAK,WAAa,KAEtB,CAMA,oBAAoBzH,EAAkC,CACpD,MAAM0H,EAAgC,CACpC,IAAK1H,EAAQ,IACb,KAAMA,EAAQ,KACd,IAAKA,EAAQ,GAAA,EAYf,GAVIA,EAAQ,WAAa,SAAW0H,EAAc,SAAW1H,EAAQ,UACjEA,EAAQ,QAAU,SAAW0H,EAAc,MAAQ1H,EAAQ,OAC3DA,EAAQ,gBAAkB,SAAW0H,EAAc,cAAgB1H,EAAQ,eAC3EA,EAAQ,kBAAoB,SAAW0H,EAAc,gBAAkB1H,EAAQ,iBAC/EA,EAAQ,QAAU,SAAW0H,EAAc,MAAQ1H,EAAQ,OAC3DA,EAAQ,SAAW,SAAW0H,EAAc,OAAS1H,EAAQ,QAC7DA,EAAQ,cAAgB,SAAW0H,EAAc,YAAc1H,EAAQ,aACvEA,EAAQ,WAAa,SAAW0H,EAAc,SAAW1H,EAAQ,UACjEA,EAAQ,UAAY,SAAW0H,EAAc,QAAU1H,EAAQ,SAE/D,KAAK,OAAO,iBAAiB0H,CAAa,IAAM,GAAO,OAE3D,MAAMC,EAAY,KAAK,OAAO,SAAS,WAAa,KACpDC,EAAAA,SAAS,gCAAiC,CACxC,IAAK5H,EAAQ,IACb,IAAKA,EAAQ,IACb,UAAA2H,CAAA,CACD,EAED,KAAK,OAAO,oBAAoB3H,EAAQ,IAAKA,EAAQ,IAAK2H,CAAS,CACrE,CAEA,iBAAiBE,EAAmE,CAClF,KAAK,OAAO,cAAcA,CAAM,EAChCD,EAAAA,SAAS,8BAA+BC,CAAM,EAE9C,KAAK,MACHC,iBAAe,KAAK,mBAAoB,CACtC,mBAAoB,SACpB,sBAAuB,OAAO,WAAA,EAC9B,WAAY,EACZ,SAAU,MACV,WAAYD,EAAO,SACnB,IAAKA,EAAO,GAAA,CACb,CAAA,CAEL,CAMQ,QAAe,CACrB,KAAK,kBAAkB,MAAA,EACvB,KAAK,iBAAmB,IAC1B,CAEA,MAAc,gBAAgBrC,EAA4B,CAIxD,GAHA,KAAK,OAAA,EACL,KAAK,iBAAmB,IAAI,gBAExB,CAAC,KAAK,WAAY,OACtB,KAAK,WAAW,UAAY,GAG5B,MAAMuC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,yBACpB,MAAMC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAY,yBACpBD,EAAQ,YAAYC,CAAO,EAC3B,KAAK,WAAW,YAAYD,CAAO,EAEnC,MAAM3H,EAAiC,CACrC,cAAe,KAAK,OAAO,aAAA,EAGvB6H,EAAY,OAAO,WAAA,EACnBC,EAAa,KAAK,IAAA,EAExB,KAAK,MACHC,mBAAiB,KAAK,mBAAoB,CACxC,SAAU,mBACV,WAAYF,EACZ,OAAQ,QAAA,CACT,CAAA,EAGH,GAAI,CAEF,MAAMG,EAAoD,CACxD,WAAY,KAAK,OAAO,UACxB,WAAY,KAAK,OAAO,SAAS,WAAa,GAC9C,eAAgB,KAAK,OAAO,SAAS,WAAa,GAClD,IAAA5C,CAAA,EAEE,KAAK,OAAO,SAAW,SAAW4C,EAAO,OAAS,KAAK,OAAO,QAClE,MAAM1I,EAAW,MAAMQ,EAAqBkI,EAAQhI,EAAW,KAAK,iBAAiB,MAAM,EAE3F,GAAI,CAAC,KAAK,WAAY,OAItB,GAHA,KAAK,WAAW,UAAY,GAGxBV,EAAS,OAAS,EACpB,GAAI,CACF,MAAM2I,EAAO3I,EAAS,IAAK4I,GAAMA,EAAE,GAAG,EAChC3H,EAAS,MAAMI,EACnB,CACE,WAAY,KAAK,OAAO,UACxB,WAAY,KAAK,OAAO,SAAS,WAAa,GAC9C,eAAgB,KAAK,OAAO,SAAS,WAAa,GAClD,KAAAsH,CAAA,EAEFjI,EACA,KAAK,iBAAiB,MAAA,EAGxB,GAAIO,EAAO,OAAS,GAAK,KAAK,WAAY,CACxC,MAAM4H,EAAa,KAAK,iBAAiB5H,CAAM,EACzC6H,EAAiB,KAAK,cAAcD,CAAU,EACpD,KAAK,WAAW,YAAYC,CAAc,EAC1C,MACF,CACF,MAAQ,CAER,CAIF,GAAI,KAAK,WAAY,CACnB,MAAMC,EAAW,KAAK,mBAAmB/I,CAAQ,EAC3CgJ,EAAe,KAAK,cAAcD,CAAQ,EAChD,KAAK,WAAW,YAAYC,CAAY,CAC1C,CAEA,KAAK,MACHC,kBAAgB,KAAK,mBAAoB,CACvC,WAAYV,EACZ,WAAY,KAAK,IAAA,EAAQC,EACzB,YAAaxI,EAAS,OACtB,OAAQ,QAAA,CACT,CAAA,EAGH,KAAK,MACHkJ,6BAA2B,KAAK,mBAAoB,CAClD,cAAelJ,EAAS,OACxB,YAAauI,EACb,gBAAiB,OACjB,OAAQ,QAAA,CACT,CAAA,CAEL,OAASY,EAAK,CACZ,GAAIA,aAAe,cAAgBA,EAAI,OAAS,aAAc,OAE9DjB,EAAAA,SAAS,uBAAwB,CAC/B,OAAQ,SACR,KAAM,cACN,QAASkB,EAAAA,sBAAsB,KAAK,OAAO,MAAM,CAAA,CAClD,EAED,KAAK,MACHC,mBAAiB,KAAK,mBAAoB,CACxC,WAAYd,EACZ,WAAY,cACZ,cAAeY,aAAe,MAAQA,EAAI,QAAU,OAAOA,CAAG,EAC9D,OAAQ,QAAA,CACT,CAAA,EAOC,KAAK,aACP,KAAK,WAAW,UAAY,GAC5B,KAAK,WAAW,MAAM,QAAU,OAEpC,CACF,CAEQ,aAAarB,EAAwC,CAE3D,MAAO,CAAE,GADIhB,EAAoBgB,EAAO,MAAM,EAC5B,GAAGA,EAAO,IAAA,CAC9B,CAEQ,wBAAyB,CAC/B,MAAMwB,EAAelD,EAAA,EACrB,OAAOmD,EAAAA,oBAAoBD,EAAc,KAAK,OAAO,UAAU,QAAQ,CACzE,CAEQ,qBAAiD,CACvD,MAAMzH,EAAa,KAAK,OAAO,WACzByD,EAAqC,CACzC,QAAUhF,GAAY,KAAK,oBAAoBA,CAAuC,EACtF,YAAc6H,GAAW,KAAK,iBAAiBA,CAAM,EACrD,KAAM,KAAK,KAAA,EAEb,OAAI,KAAK,OAAO,eAAiB,SAAW7C,EAAQ,aAAe,KAAK,OAAO,cAC3EzD,IAAe,SAAWyD,EAAQ,WAAazD,GAC5CyD,CACT,CAEQ,cAAcgB,EAA2B,CAC/C,MAAMC,EAAW,KAAK,uBAAA,EAChBjB,EAAU,KAAK,oBAAA,EACfkB,EAAkB,KAAK,OAAO,UAAU,iBAAmBL,EAC3DqD,EAAgB,CAACC,EAAmBC,IACxCrD,EAAmBoD,EAAWC,EAAcnD,EAAUC,CAAe,EAEjEmD,EAAW,KAAK,OAAO,UAAU,aACvC,OAAKA,EAOEA,EAASrD,EAAMhB,EAL0C,CAC9D,SAAAiB,EACA,gBAAAC,EACA,cAAAgD,CAAA,CAEoC,EAPhBA,EAAclD,EAAMhB,CAAO,CAQnD,CAEQ,mBAAmBtF,EAAuC,CAChE,MAAM4J,EAAsC,CAAA,EACtCC,EAAqB,CAAA,EAC3B,QAAS,EAAI,EAAG,EAAI7J,EAAS,OAAQ,IAAK,CACxC,MAAMM,EAAUN,EAAS,CAAC,EACpB8J,EAAK,WAAW,CAAC,GACvBD,EAAS,KAAKC,CAAE,EAChBF,EAASE,CAAE,EAAI,CACb,KAAM,cACN,MAAO,CACL,QAAAxJ,EACA,MAAO,EACP,aAAc,KAAK,OAAO,YAAA,CAC5B,CAEJ,CACA,OAAAsJ,EAAS,KAAU,CACjB,KAAM,cACN,MAAO,CACL,OAAQ,MAAA,EAEV,SAAAC,CAAA,EAEK,CACL,KAAM,OACN,SAAAD,CAAA,CAEJ,CAEQ,iBACN3I,EAKQ,CACR,MAAO,CACL,KAAM,OACN,SAAU,CACR,KAAM,CACJ,KAAM,YACN,MAAO,CAAE,OAAAA,CAAA,CAAO,CAClB,CACF,CAEJ,CACF,CAEO,SAAS8I,GAAoC,CAClD,OAAO,IAAInC,CACb"}
|
package/dist/simrel.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.gengage-simrel-container{font-family:var(--gengage-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);font-size:var(--gengage-font-size, 14px);color:var(--gengage-foreground-color, #333)}.gengage-simrel-uispec>*{animation:gengage-simrel-enter .2s cubic-bezier(.2,.72,.2,1) both}@keyframes gengage-simrel-enter{0%{opacity:0;transform:translateY(8px) scale(.99)}to{opacity:1;transform:translateY(0) scale(1)}}.gengage-simrel-grid{display:grid;grid-template-columns:repeat(var(--gengage-simrel-columns, 4),minmax(0,1fr));gap:14px;padding:10px 0 16px}@media(max-width:992px){.gengage-simrel-grid{grid-template-columns:repeat(3,1fr)}}@media(max-width:768px){.gengage-simrel-grid{grid-template-columns:repeat(2,1fr);gap:12px}}.gengage-simrel-card{display:flex;flex-direction:column;border:1px solid #e6e9f0;border-radius:var(--gengage-simrel-card-radius, 14px);overflow:hidden;background:var(--gengage-background-color, #fff);cursor:pointer;transition:box-shadow .16s ease,transform .16s cubic-bezier(.2,.8,.2,1),border-color .16s ease;box-shadow:0 2px 10px #0f172a14}.gengage-simrel-card:hover{border-color:#bfd6ff;border-color:color-mix(in srgb,var(--gengage-primary-color, #3b82f6) 44%,#d1d5db 56%);box-shadow:0 12px 24px #0f172a24;transform:translateY(-2px)}.gengage-simrel-card-image{position:relative;aspect-ratio:1;overflow:hidden;background:radial-gradient(circle at 80% 15%,#94a3b826,#f9fafb 62%)}.gengage-simrel-card-image img{width:100%;height:100%;object-fit:contain;transition:transform .18s ease}.gengage-simrel-card:hover .gengage-simrel-card-image img{transform:scale(1.02)}.gengage-simrel-badge{position:absolute;top:8px;left:8px;padding:2px 8px;border-radius:4px;background:#ef4444;color:#fff;font-size:12px;font-weight:600}.gengage-simrel-card-info{flex:1;padding:12px 12px 10px;display:flex;flex-direction:column;gap:4px}.gengage-simrel-card-brand{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:#6b7280}.gengage-simrel-card-name{font-weight:600;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:36px}.gengage-simrel-card-rating{font-size:12px;color:#f59e0b}.gengage-simrel-card-review-count{color:#9ca3af}.gengage-simrel-card-price{margin-top:auto;padding-top:4px;display:flex;align-items:baseline;gap:6px}.gengage-simrel-card-price-original{text-decoration:line-through;color:#9ca3af;font-size:12px}.gengage-simrel-card-price-current{font-weight:700;color:var(--gengage-primary-color, #333)}.gengage-simrel-atc{display:block;width:100%;padding:10px 12px;border:none;border-top:1px solid #e5e7eb;background:transparent;color:var(--gengage-primary-color, #3b82f6);font-weight:600;font-size:inherit;font-family:inherit;cursor:pointer;transition:background-color .2s}.gengage-simrel-atc:hover{background:var(--gengage-primary-color, #3b82f6);color:var(--gengage-primary-foreground, #fff)}.gengage-simrel-quick-actions{display:flex;flex-wrap:wrap;gap:8px;padding:6px 12px 12px}.gengage-simrel-quick-action{border:1px solid #d2d8e3;background:#f8fafc;color:#334155;border-radius:999px;padding:8px 10px;font-size:12px;font-weight:600;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease,border-color .12s ease}.gengage-simrel-quick-action:hover{border-color:var(--gengage-primary-color, #3b82f6);color:var(--gengage-primary-color, #3b82f6);box-shadow:0 6px 14px #0f172a1f;transform:translateY(-1px)}.gengage-simrel-empty{grid-column:1 / -1;text-align:center;padding:40px 20px;color:#6b7280}.gengage-simrel-tabs{display:flex;gap:4px;border-bottom:2px solid #e5e7eb;margin-bottom:16px;overflow-x:auto}.gengage-simrel-tab{padding:10px 14px;border:none;background:transparent;color:#6b7280;font-size:inherit;font-family:inherit;cursor:pointer;white-space:nowrap;border-bottom:2px solid transparent;margin-bottom:-2px;transition:color .2s,border-color .2s}.gengage-simrel-tab:hover{color:var(--gengage-primary-color, #3b82f6)}.gengage-simrel-tab--active{color:var(--gengage-primary-color, #3b82f6);border-bottom-color:var(--gengage-primary-color, #3b82f6);font-weight:600}.gengage-simrel-loading{display:flex;justify-content:center;padding:40px}.gengage-simrel-spinner{width:32px;height:32px;border:3px solid #e5e7eb;border-top-color:var(--gengage-primary-color, #3b82f6);border-radius:50%;animation:gengage-simrel-spin .7s linear infinite}@keyframes gengage-simrel-spin{to{transform:rotate(360deg)}}@media(max-width:768px){.gengage-simrel-grid{gap:10px;padding-top:8px}}@media(prefers-reduced-motion:reduce){.gengage-simrel-uispec>*,.gengage-simrel-card,.gengage-simrel-card-image img,.gengage-simrel-quick-action{animation:none!important;transition:none!important;transform:none!important}}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
(function(z){"use strict";const dt=({element:t,renderElement:e})=>{if(!t.children||t.children.length===0)return null;const n=document.createElement("div");for(const r of t.children){const i=e(r);i&&n.appendChild(i)}return n};function ut(t){const e=document.createElement("div");if(e.className=t.containerClassName,!t.spec.elements[t.spec.root])return e;const r=t.unknownRenderer??dt,i=a=>{const o=t.spec.elements[a];if(!o)return null;const c=t.registry[o.type];return c?c({elementId:a,element:o,spec:t.spec,context:t.context,renderElement:i}):r({elementId:a,element:o,spec:t.spec,context:t.context,renderElement:i})},s=i(t.spec.root);return s&&e.appendChild(s),e}function lt(t,e){if(!e)return t;const n={...t};for(const[r,i]of Object.entries(e))i&&(n[r]=i);return n}function ft(t,e){const n={event_name:"stream.start",account_id:t.account_id,session_id:t.session_id,correlation_id:t.correlation_id,payload:{endpoint:e.endpoint,request_id:e.request_id}};return t.view_id!==void 0&&(n.view_id=t.view_id),t.user_id!==void 0&&(n.user_id=t.user_id),e.widget!==void 0&&(n.widget=e.widget),t.page_type!==void 0&&(n.page_type=t.page_type),t.sku!==void 0&&(n.sku=t.sku),n}function pt(t,e){const n={event_name:"stream.done",account_id:t.account_id,session_id:t.session_id,correlation_id:t.correlation_id,payload:{request_id:e.request_id,latency_ms:e.latency_ms,chunk_count:e.chunk_count}};return t.view_id!==void 0&&(n.view_id=t.view_id),t.user_id!==void 0&&(n.user_id=t.user_id),e.widget!==void 0&&(n.widget=e.widget),t.page_type!==void 0&&(n.page_type=t.page_type),t.sku!==void 0&&(n.sku=t.sku),n}function ht(t,e){const n={event_name:"stream.error",account_id:t.account_id,session_id:t.session_id,correlation_id:t.correlation_id,payload:{request_id:e.request_id,error_code:e.error_code,error_message:e.error_message}};return t.view_id!==void 0&&(n.view_id=t.view_id),t.user_id!==void 0&&(n.user_id=t.user_id),e.widget!==void 0&&(n.widget=e.widget),t.page_type!==void 0&&(n.page_type=t.page_type),t.sku!==void 0&&(n.sku=t.sku),n}function mt(t,e){const n={event_name:"metering.summary",account_id:t.account_id,session_id:t.session_id,correlation_id:t.correlation_id,payload:{meter_key:e.meter_key,quantity:e.quantity,unit:e.unit}};return t.view_id!==void 0&&(n.view_id=t.view_id),t.user_id!==void 0&&(n.user_id=t.user_id),t.page_type!==void 0&&(n.page_type=t.page_type),t.sku!==void 0&&(n.sku=t.sku),n}function gt(t,e){const n={event_name:"widget.history.snapshot",account_id:t.account_id,session_id:t.session_id,correlation_id:t.correlation_id,widget:e.widget,payload:{message_count:e.message_count,history_ref:e.history_ref,redaction_level:e.redaction_level}};return t.view_id!==void 0&&(n.view_id=t.view_id),t.user_id!==void 0&&(n.user_id=t.user_id),t.page_type!==void 0&&(n.page_type=t.page_type),t.sku!==void 0&&(n.sku=t.sku),n}function yt(t,e){const n={event_name:"basket.add",account_id:t.account_id,session_id:t.session_id,correlation_id:t.correlation_id,widget:e.attribution_source,payload:{attribution_source:e.attribution_source,attribution_action_id:e.attribution_action_id,cart_value:e.cart_value,currency:e.currency,line_items:e.line_items,sku:e.sku}};return t.view_id!==void 0&&(n.view_id=t.view_id),t.user_id!==void 0&&(n.user_id=t.user_id),t.page_type!==void 0&&(n.page_type=t.page_type),t.sku!==void 0&&(n.sku=t.sku),n}function _t(t,e){const n={event_name:"checkout.start",account_id:t.account_id,session_id:t.session_id,correlation_id:t.correlation_id,widget:e.attribution_source,payload:{attribution_source:e.attribution_source,attribution_action_id:e.attribution_action_id,cart_value:e.cart_value,currency:e.currency,line_items:e.line_items}};return t.view_id!==void 0&&(n.view_id=t.view_id),t.user_id!==void 0&&(n.user_id=t.user_id),t.page_type!==void 0&&(n.page_type=t.page_type),t.sku!==void 0&&(n.sku=t.sku),n}function vt(t,e){const n={event_name:"checkout.complete",account_id:t.account_id,session_id:t.session_id,correlation_id:t.correlation_id,widget:e.attribution_source,payload:{attribution_source:e.attribution_source,attribution_action_id:e.attribution_action_id,cart_value:e.cart_value,currency:e.currency,line_items:e.line_items}};return t.view_id!==void 0&&(n.view_id=t.view_id),t.user_id!==void 0&&(n.user_id=t.user_id),t.page_type!==void 0&&(n.page_type=t.page_type),t.sku!==void 0&&(n.sku=t.sku),n}function ce(t,e){window.dispatchEvent(new CustomEvent(t,{detail:e,bubbles:!1}))}function we(t,e){const n=r=>{e(r.detail)};return window.addEventListener(t,n),()=>window.removeEventListener(t,n)}function kt(){const e=window.__gengageSessionId??sessionStorage.getItem("gengage_session_id")??null??crypto.randomUUID();return window.__gengageSessionId=e,sessionStorage.setItem("gengage_session_id",e),window.gengage||(window.gengage={}),window.gengage.sessionId=e,e}function bt(t){return{sessionId:t?.sessionId??kt(),...t}}const xe={"--gengage-chat-offset":"20px","--gengage-chat-launcher-size":"56px","--gengage-chat-width":"400px","--gengage-chat-shell-radius":"12px","--gengage-chat-header-height":"60px","--gengage-chat-conversation-width":"396px","--gengage-chat-panel-min-width":"320px","--gengage-chat-panel-max-width":"860px","--gengage-chat-input-height":"48px","--gengage-qna-pill-radius":"999px","--gengage-qna-input-radius":"14px","--gengage-simrel-card-radius":"14px"};function wt(t){return t?{...xe,...t}:{...xe}}const O="gengage-global-toast-root",Ce="gengage-global-toast-style",de="gengage-global-toast-root--visible",xt=4200,Ct=1500,Tt=15e3;let Te=!1,V=null;function St(t){return typeof t=="string"&&t.toLowerCase().startsWith("tr")?"Baglanti sorunu olustu. Lutfen tekrar deneyin.":"Connection issue. Please try again."}function Et(){Te||typeof window>"u"||typeof document>"u"||(Te=!0,we("gengage:global:error",t=>{At(t)}))}function At(t){if(typeof document>"u")return;const e=t.message.trim();if(!e)return;Pt();const n=Rt();n.innerHTML="";const r=document.createElement("section");r.className="gengage-global-toast gengage-global-toast--error",r.setAttribute("role","status"),r.setAttribute("aria-live","polite");const i=document.createElement("div");i.className="gengage-global-toast-title",i.textContent=Nt(t.source);const s=document.createElement("div");s.className="gengage-global-toast-message",s.textContent=e,r.appendChild(i),r.appendChild(s),n.appendChild(r),n.classList.add(de),V&&(clearTimeout(V),V=null),V=setTimeout(()=>{It()},Ot(t.durationMs))}function It(){if(typeof document>"u")return;const t=document.getElementById(O);t&&(t.classList.remove(de),t.innerHTML="",V&&(clearTimeout(V),V=null))}function Nt(t){switch(t){case"chat":return"Chat warning";case"qna":return"QnA warning";case"simrel":return"Widget warning";default:return"Connection warning"}}function Rt(){const t=document.getElementById(O);if(t instanceof HTMLElement)return t;const e=document.createElement("div");return e.id=O,e.className="gengage-global-toast-root",document.body.appendChild(e),e}function Ot(t){return typeof t!="number"||!Number.isFinite(t)?xt:Math.min(Tt,Math.max(Ct,Math.round(t)))}function Pt(){if(document.getElementById(Ce))return;const t=document.createElement("style");t.id=Ce,t.textContent=`
|
|
2
|
+
#${O} {
|
|
3
|
+
position: fixed;
|
|
4
|
+
top: 16px;
|
|
5
|
+
right: 16px;
|
|
6
|
+
z-index: 2147483646;
|
|
7
|
+
pointer-events: none;
|
|
8
|
+
}
|
|
9
|
+
#${O}.${de} {
|
|
10
|
+
pointer-events: auto;
|
|
11
|
+
}
|
|
12
|
+
#${O} .gengage-global-toast {
|
|
13
|
+
min-width: 260px;
|
|
14
|
+
max-width: min(92vw, 420px);
|
|
15
|
+
border-radius: 12px;
|
|
16
|
+
border: 1px solid #f5c2c7;
|
|
17
|
+
border-left: 4px solid #d93025;
|
|
18
|
+
background: #fff9f9;
|
|
19
|
+
color: #4a1f21;
|
|
20
|
+
box-shadow: 0 10px 30px rgba(38, 18, 18, 0.18);
|
|
21
|
+
padding: 10px 12px;
|
|
22
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
23
|
+
font-size: 13px;
|
|
24
|
+
line-height: 1.4;
|
|
25
|
+
animation: gengage-global-toast-in 180ms ease-out forwards;
|
|
26
|
+
}
|
|
27
|
+
#${O} .gengage-global-toast-title {
|
|
28
|
+
margin: 0 0 4px;
|
|
29
|
+
font-size: 12px;
|
|
30
|
+
font-weight: 700;
|
|
31
|
+
}
|
|
32
|
+
#${O} .gengage-global-toast-message {
|
|
33
|
+
margin: 0;
|
|
34
|
+
font-weight: 500;
|
|
35
|
+
}
|
|
36
|
+
@keyframes gengage-global-toast-in {
|
|
37
|
+
from {
|
|
38
|
+
opacity: 0;
|
|
39
|
+
transform: translateY(-8px);
|
|
40
|
+
}
|
|
41
|
+
to {
|
|
42
|
+
opacity: 1;
|
|
43
|
+
transform: translateY(0);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
`,document.head.appendChild(t)}class Lt{constructor(){this.isVisible=!1,this.isInitialised=!1,this._handlers=new Map,this._cleanups=[],this._ownsRoot=!1}async init(e){if(this.isInitialised){console.warn("[gengage] Widget already initialised. Call update() instead.");return}const n=wt(e.theme);this.config={...e,theme:n,session:bt(e.session)},this.root=this._resolveMount(e.mountTarget),this._applyTheme(n),Et();const r=we("gengage:context:update",i=>this.update(i));this._cleanups.push(r),await this.onInit(this.config),this.isInitialised=!0,this.emit("ready")}update(e){this.isInitialised&&(this.config.pageContext?this.config={...this.config,pageContext:{...this.config.pageContext,...e}}:this.config={...this.config,pageContext:e},this.onUpdate(e))}show(){this.isVisible||(this.isVisible=!0,this.root.style.display="",this.onShow(),this.emit("show"))}hide(){this.isVisible&&(this.isVisible=!1,this.root.style.display="none",this.onHide(),this.emit("hide"))}destroy(){this._cleanups.forEach(e=>e()),this._cleanups.length=0,this._handlers.clear(),this.onDestroy(),this._ownsRoot?this.root.remove():this.root.innerHTML="",this.isInitialised=!1}on(e,n){return this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(n),()=>this._handlers.get(e)?.delete(n)}trackCheckout(e,n){const r=e==="start"?_t:vt;this.track(r(this.analyticsContext(),n))}flushMeteringSummary(e){this.track(mt(this.analyticsContext(),e))}emit(e,...n){this._handlers.get(e)?.forEach(r=>r(...n))}addCleanup(e){this._cleanups.push(e)}track(e){this.config.analyticsClient?.track(e)}analyticsContext(){const e={account_id:this.config.accountId,session_id:this.config.session?.sessionId??"",correlation_id:this.config.session?.sessionId??""};return this.config.session?.viewId!==void 0&&(e.view_id=this.config.session.viewId),this.config.session?.userId!==void 0&&(e.user_id=this.config.session.userId),this.config.pageContext?.pageType!==void 0&&(e.page_type=this.config.pageContext.pageType),this.config.pageContext?.sku!==void 0&&(e.sku=this.config.pageContext.sku),e}_resolveMount(e){if(e instanceof HTMLElement)return e;if(typeof e=="string"){const r=document.querySelector(e);if(!r)throw new Error(`[gengage] Mount target not found: "${e}"`);return r}const n=document.createElement("div");return n.dataset.gengageWidget=this.constructor.name.toLowerCase(),document.body.appendChild(n),this._ownsRoot=!0,n}_applyTheme(e){if(e){for(const[n,r]of Object.entries(e))if(r!==void 0){const i=n.startsWith("--")?n:`--gengage-${jt(n)}`;this.root.style.setProperty(i,r)}}}}function jt(t){return t.replace(/([A-Z])/g,"-$1").toLowerCase()}const Zt={process_action:"/process_action",launcher_action:"/launcher_action",similar_products:"/similar_products",product_groupings:"/product_groupings",proactive_action:"/proactive_action"};function $t(t){if(t===void 0)throw new Error("[gengage] middlewareUrl is required. Pass your Gengage backend URL in widget config.");const e=t.trim();return e===""?"":e.replace(/\/+$/,"")}function Se(t,e){return`${$t(e?.middlewareUrl)}/chat${Zt[t]}`}function Mt(t){const e=[];let n=0,r=!1,i=!1,s=0;for(let a=0;a<t.length;a++){const o=t[a];if(i){i=!1;continue}if(o==="\\"&&r){i=!0;continue}if(o==='"'){r=!r;continue}r||(o==="{"&&n++,o==="}"&&(n--,n===0&&(e.push(t.slice(s,a+1)),s=a+1)))}return e.length>0?e:[t]}function Ee(t,e){const n=t.trim();if(!n||n.startsWith(":"))return!1;const r=n.startsWith("data: ")?n.slice(6):n;if(r==="[DONE]")return!0;try{const i=JSON.parse(r);return e.onEvent(i),i.type==="done"?(e.onDone?.(),!0):!1}catch{const i=Mt(r);if(i.length>1){for(const s of i)try{const a=JSON.parse(s);if(e.onEvent(a),a.type==="done")return e.onDone?.(),!0}catch{}return!1}return!1}}async function Ae(t,e){if(!t.ok){e.onError?.(new Error(`HTTP ${t.status}: ${t.statusText}`));return}if(!t.body){e.onError?.(new Error("Response body is null — streaming not supported"));return}const n=t.body.getReader(),r=new TextDecoder("utf-8");let i="";try{for(;;){const{done:s,value:a}=await n.read();if(s)break;i+=r.decode(a,{stream:!0});const o=i.split(`
|
|
47
|
+
`);i=o.pop()??"";for(const c of o)if(Ee(c,e))return}i.trim()&&Ee(i,e)}catch(s){if(s instanceof DOMException&&s.name==="AbortError")return;e.onError?.(s instanceof Error?s:new Error(String(s)))}finally{n.releaseLock()}e.onDone?.()}function Ie(t){if(typeof t.type!="string")return null;if(Dt(t))return t;const n=t;switch(n.type){case"outputText":return Ut(n);case"suggestedActions":return zt(n);case"productList":return Vt(n);case"productDetails":return qt(n);case"productDetailsSimilars":return Bt(n);case"comparisonTable":return Gt(n);case"context":return Ft(n);case"chatStreamEnd":return Ht();case"loading":return Wt(n);case"panelLoading":return Jt(n);case"similarLoading":return Qt(n);case"redirect":return Yt(n);case"error":return Xt(n);case"dummy":return Kt();case"launcherAction":return en(n);case"text":return ue(n);case"productItem":return tn(n);case"text_image":return Ne(n);case"quick_qna":return Re(n);case"reviewHighlights":return nn(n);case"aiProductSuggestions":return an(n);case"aiProductGroupings":return on(n);case"aiSuggestedSearches":return cn(n);case"prosAndCons":return rn(n);case"getGroundingReview":return dn(n);case"voice":return ln(n);case"visitorDataResponse":return sn(n);case"productListPreview":return un();case"groupList":return fn(n);case"formGetInfo":case"formTestDrive":case"formServiceRequest":case"launchFormPage":return pn(n);case"launcherContent":return hn(n);default:return null}}function Dt(t){const e=t.type;if(typeof e!="string")return!1;switch(e){case"metadata":return typeof t.sessionId=="string"&&typeof t.model=="string";case"text_chunk":return typeof t.content=="string";case"ui_spec":{const n=t.widget;if(n!=="chat"&&n!=="qna"&&n!=="simrel")return!1;const r=q(t.spec);return r?typeof r.root=="string"&&q(r.elements)!==null:!1}case"action":{const n=q(t.action);return n!==null&&typeof n.kind=="string"}case"error":return typeof t.code=="string"&&typeof t.message=="string";case"done":return!0;default:return!1}}function Ut(t){const e=w(t.payload.text,t.payload.plain_text)??"",n=w(t.payload.plain_text,t.payload.text)??e;if(t.payload.is_error)return{type:"error",code:"BACKEND_ERROR",message:n||"Backend returned an error"};const r={type:"text_chunk",content:e,final:!0},i=t.payload.product_mentions;Array.isArray(i)&&i.length>0&&(r.productMentions=i.filter(o=>typeof o=="object"&&o!==null&&typeof o.sku=="string"&&typeof o.short_name=="string"));const s=t.payload.sku_to_product_item;s&&typeof s=="object"&&!Array.isArray(s)&&(r.skuToProductItem=s);const a=t.payload.conversation_mode;return typeof a=="string"&&a&&(r.conversationMode=a),r}function zt(t){const e=(t.payload.actions??[]).map(n=>{const r=w(n.title)??"",i=P(n.requestDetails,r),s=i?{label:r,action:i}:null;return s?(typeof n.icon=="string"&&(s.icon=n.icon),typeof n.image=="string"&&(s.image=n.image),s):null});return Oe(e.filter(Le),"chat")}function Vt(t){const e=Pe(t.payload.product_list??[],"chat");e.panelHint="panel";const n=e.spec.elements[e.spec.root];return n&&(typeof t.payload.offset=="number"&&(n.props={...n.props,offset:t.payload.offset}),typeof t.payload.end_of_list=="boolean"&&(n.props={...n.props,endOfList:t.payload.end_of_list})),e}function qt(t){const e=t.payload.productDetails;return e?{type:"ui_spec",widget:"chat",spec:{root:"root",elements:{root:{type:"ProductDetailsPanel",props:{product:L(e)}}}},panelHint:"panel"}:gn("chat")}function Bt(t){const e=Pe(t.payload.similarProducts??[],"chat"),n=e.spec.elements[e.spec.root];return n&&(n.props={...n.props,similarsAppend:!0}),{...e,panelHint:"panel"}}function Gt(t){const e=t.payload.multiple_product_details??[],n=t.payload.product_comparison_framework,r=t.payload.table,i=[];for(const m of e){const E=L(m);i.push(E)}const s=[];if(r){const m=n?.criteria_view??n?.criteria_view_short??{},E=n?.compared_field_names??Object.keys(r);for(const G of E){const ke=r[G];if(!ke||!Array.isArray(ke))continue;const pr=m[G]??G;s.push({label:pr,values:ke.map(be=>typeof be=="string"?be:String(be??""))})}}let a;n?.recommended_choice_sku?a=n.recommended_choice_sku:n?.winner_product&&n.winner_product.length>0&&(a=n.winner_product[0]?.sku);const o=a?i.find(m=>m.sku===a)??i[0]:i[0],c=[];if(n?.key_differences)for(const m of n.key_differences)typeof m=="string"&&c.push(m);const d=[];if(n?.special_considerations)for(const m of n.special_considerations)typeof m=="string"&&d.push(m);const p=n?.recommended_choice,v=n?.winner_hits,C={};for(const m of i){const E=m.sku;E&&(C[E]={title:m.name??E,type:"launchSingleProduct",payload:{sku:E}})}const T={products:i,attributes:s,highlights:c,productActions:C};return o&&(T.recommended=o),d.length>0&&(T.specialCases=d),p&&(T.recommendedText=p),v&&(T.winnerHits=v),typeof n?.key_differences=="string"&&(T.keyDifferencesHtml=n.key_differences),n?.special_considerations&&(T.specialConsiderations=n.special_considerations),{type:"ui_spec",widget:"chat",spec:{root:"root",elements:{root:{type:"ComparisonTable",props:T}}},panelHint:"panel"}}function Ft(t){return{type:"metadata",sessionId:"",model:"",meta:{panel:t.payload.panel,messages:t.payload.messages,message_id:t.payload.message_id}}}function Ht(){return{type:"done"}}function Wt(t){return{type:"metadata",sessionId:"",model:"",meta:{loading:!0,loadingText:t.payload.text,thinkingMessages:t.payload.thinking_messages,dynamicLoading:t.payload.is_dynamic===!0}}}function Jt(t){return{type:"metadata",sessionId:"",model:"",meta:{loading:!0,panelLoading:!0,panelPendingType:t.payload?.pending_type,loadingText:t.payload?.text}}}function Qt(t){return{type:"metadata",sessionId:"",model:"",meta:{loading:!0,similarPanelLoading:!0,panelPendingType:t.payload?.pending_type,loadingText:t.payload?.text}}}function Yt(t){const e=w(t.payload.url);return e?{type:"action",action:{kind:"navigate",url:e,newTab:t.payload.new_tab===!0}}:{type:"metadata",sessionId:"",model:"",meta:{redirect:t.payload,redirectTarget:w(t.payload.to)}}}function Xt(t){return{type:"error",code:"BACKEND_ERROR",message:w(t.payload?.text,t.payload?.message,t.payload?.error)??"Backend returned an error"}}function Kt(t){return{type:"metadata",sessionId:"",model:"",meta:{noop:!0}}}function en(t){const e=t.payload??{};if(Array.isArray(e.action_list)){const s={action_list:e.action_list},a=typeof e.type=="string"?e.type:void 0,o=typeof e.theme=="string"?e.theme:void 0;return a!==void 0&&(s.type=a),o!==void 0&&(s.theme=o),Re({payload:s})}const r=q(e.action);if(r){const s={action:r},a=typeof e.text=="string"?e.text:void 0,o=typeof e.image_url=="string"?e.image_url:void 0,c=typeof e.theme=="string"?e.theme:void 0;return a!==void 0&&(s.text=a),o!==void 0&&(s.image_url=o),c!==void 0&&(s.theme=c),Ne({payload:s})}const i=typeof e.text=="string"?e.text:"";if(i){const s={text:i},a=typeof e.type=="string"?e.type:void 0,o=typeof e.theme=="string"?e.theme:void 0,c=q(e.payload)??void 0;return a!==void 0&&(s.type=a),c!==void 0&&(s.payload=c),o!==void 0&&(s.theme=o),ue({payload:s})}return{type:"metadata",sessionId:"",model:"",meta:{launcherAction:e}}}function ue(t){const e={text:w(t.payload.text)??""};return typeof t.payload.theme=="string"&&(e.theme=t.payload.theme),t.payload.payload!==void 0&&(e.payload=t.payload.payload),{type:"ui_spec",widget:"qna",spec:{root:"root",elements:{root:{type:"QuestionHeading",props:e}}}}}function tn(t){return mn(t.payload,"qna")}function Ne(t){const e=w(t.payload.text)??"",n=P(t.payload.action,e);if(n){const i={label:e||n.title,action:n};return typeof t.payload.image_url=="string"&&(i.image=t.payload.image_url),typeof t.payload.theme=="string"&&(i.theme=t.payload.theme),{type:"ui_spec",widget:"qna",spec:{root:"root",elements:{root:{type:"ActionButton",props:i}}}}}const r={text:e};return typeof t.payload.theme=="string"&&(r.theme=t.payload.theme),ue({payload:r})}function Re(t){const e=(t.payload.action_list??[]).map(n=>{const r=w(n.title)??"",i=P(n.requestDetails,r),s=i?{label:r,action:i}:null;return s?(typeof n.icon=="string"&&(s.icon=n.icon),typeof n.image=="string"&&(s.image=n.image),s):null});return Oe(e.filter(Le),"qna")}function nn(t){const n={reviews:(t.payload.reviews??[]).map(r=>{const i={};return typeof r.review_class=="string"&&(i.review_class=r.review_class),typeof r.review_text=="string"&&(i.review_text=r.review_text),(typeof r.review_rating=="string"||typeof r.review_rating=="number")&&(i.review_rating=r.review_rating),typeof r.review_tag=="string"&&(i.review_tag=r.review_tag),i})};return typeof t.payload.sku=="string"&&(n.sku=t.payload.sku),{type:"ui_spec",widget:"chat",spec:{root:"root",elements:{root:{type:"ReviewHighlights",props:n}}}}}function rn(t){const e={};return Array.isArray(t.payload.pros)&&(e.pros=t.payload.pros),Array.isArray(t.payload.cons)&&(e.cons=t.payload.cons),typeof t.payload.product_name=="string"&&(e.productName=t.payload.product_name),{type:"ui_spec",widget:"chat",spec:{root:"root",elements:{root:{type:"ProsAndCons",props:e}}}}}function sn(t){return{type:"metadata",sessionId:"",model:"",meta:{visitorDataResponse:t.payload}}}function an(t){const e=t.payload.product_suggestions??[],n=[];for(let r=0;r<e.length;r++){const i=e[r];if(!i)continue;const s=yn(i);if(!s)continue;const a={product:s},o=P(i.requestDetails,s.name);o&&(a.action=o),typeof i.role=="string"&&(a.role=i.role),typeof i.reason=="string"&&(a.reason=i.reason),typeof i.review_highlight=="string"&&(a.reviewHighlight=i.review_highlight),Array.isArray(i.labels)&&(a.labels=i.labels),typeof i.expert_quality_score=="number"&&(a.expertQualityScore=i.expert_quality_score),n.push(a)}return n.length===0?{type:"metadata",sessionId:"",model:"",meta:{aiProductSuggestions:t.payload.product_suggestions??[]}}:{type:"ui_spec",widget:"chat",spec:{root:"root",elements:{root:{type:"AITopPicks",props:{suggestions:n}}}}}}function on(t){const e=t.payload.product_groupings??[],n=[];for(let r=0;r<e.length;r++){const i=e[r];if(!i)continue;const s=w(i.name)??"",a=i.sku&&i.sku.length>0?{type:"findSimilar",payload:{sku:i.sku}}:void 0,o=P(i.requestDetails??a,s);if(!o)continue;const c={name:s,action:o};if(Array.isArray(i.labels)){const d=i.labels.filter(p=>typeof p=="string");d.length>0&&(c.labels=d)}typeof i.image=="string"&&(c.image=i.image),n.push(c)}return n.length===0?{type:"metadata",sessionId:"",model:"",meta:{aiProductGroupings:t.payload.product_groupings??[]}}:{type:"ui_spec",widget:"chat",spec:{root:"root",elements:{root:{type:"AIGroupingCards",props:{entries:n}}}}}}function cn(t){const e=t.payload.suggested_searches??[],n=[];for(let r=0;r<e.length;r++){const i=e[r];if(!i)continue;const s=w(i.short_name,i.chosen_attribute,i.detailed_user_message)??`Arama ${r+1}`,a={},o=w(i.detailed_user_message);o&&(a.text=o),i.group_skus&&Array.isArray(i.group_skus)&&(a.group_skus=i.group_skus);const c=w(i.sku,i.representative_product_sku);c&&(a.sku=c),a.is_suggested_text=1;const d={type:"inputText",payload:a},p=P(i.requestDetails??d,s);if(!p)continue;const v={shortName:s,action:p},C=w(i.detailed_user_message);C&&C!==s&&(v.detailedMessage=C);const T=w(i.why_different);T&&(v.whyDifferent=T),typeof i.image=="string"&&(v.image=i.image),n.push(v)}return n.length===0?{type:"metadata",sessionId:"",model:"",meta:{aiSuggestedSearches:t.payload.suggested_searches??[]}}:{type:"ui_spec",widget:"chat",spec:{root:"root",elements:{root:{type:"AISuggestedSearchCards",props:{entries:n}}}}}}function dn(t){const e=P(t.payload.requestDetails,w(t.payload.review_count,t.payload.text,t.payload.title)??"Urun yorumlarini goster");if(!e)return{type:"metadata",sessionId:"",model:"",meta:{groundingReview:t.payload}};const n={action:e};return t.payload.title&&(n.title=t.payload.title),t.payload.text&&(n.text=t.payload.text),t.payload.review_count&&(n.reviewCount=t.payload.review_count),{type:"ui_spec",widget:"chat",spec:{root:"root",elements:{root:{type:"GroundingReviewCard",props:n}}}}}function un(){return{type:"metadata",sessionId:"",model:"",meta:{analyzeAnimation:!0}}}function ln(t){return{type:"metadata",sessionId:"",model:"",meta:{voice:t.payload}}}function fn(t){const e=t.payload.group_list??[],n=[];for(const i of e){const s=i.group_name??"",a=(i.product_list??[]).map(L);n.push({groupName:s,products:a})}const r=[];for(const i of t.payload.filter_tags??[]){const s=i.title??"";if(!s)continue;const a=P(i.requestDetails,s),o={title:s};a&&(o.action=a),r.push(o)}return{type:"ui_spec",widget:"chat",spec:{root:"root",elements:{root:{type:"CategoriesContainer",props:{groups:n,filterTags:r}}}},panelHint:"panel"}}function pn(t){return{type:"metadata",sessionId:"",model:"",meta:{formType:t.type,formPayload:t.payload??{}}}}function hn(t){return{type:"metadata",sessionId:"",model:"",meta:{launcherContent:t.payload??{}}}}function Oe(t,e){const n={},r=[];for(let i=0;i<t.length;i++){const s=t[i];if(!s)continue;const a=`action-${i}`;r.push(a);const o={label:s.label,action:s.action};s.icon!==void 0&&(o.icon=s.icon),s.image!==void 0&&(o.image=s.image),s.description!==void 0&&(o.description=s.description),n[a]={type:"ActionButton",props:o}}return n.root={type:"ActionButtons",props:{buttons:t.map(i=>{const s={label:i.label,action:i.action};return i.image!==void 0&&(s.image=i.image),i.description!==void 0&&(s.description=i.description),i.icon!==void 0&&(s.icon=i.icon),s})},children:r},{type:"ui_spec",widget:e,spec:{root:"root",elements:n}}}function Pe(t,e){const n={},r=[];for(let i=0;i<t.length;i++){const s=t[i];if(!s)continue;const a=`product-${i}`;r.push(a),n[a]={type:"ProductCard",props:{product:L(s),index:i}}}return n.root={type:"ProductGrid",props:{layout:"grid"},children:r},{type:"ui_spec",widget:e,spec:{root:"root",elements:n}}}function mn(t,e){return{type:"ui_spec",widget:e,spec:{root:"root",elements:{root:{type:"ProductCard",props:{product:L(t),index:0}}}}}}function gn(t){return{type:"ui_spec",widget:t,spec:{root:"root",elements:{root:{type:"ActionButtons",props:{buttons:[]},children:[]}}}}}function yn(t){const e=w(t.sku),n=w(t.short_name),r=q(t.product_item)??t;return _n(r,e,n)}function _n(t,e,n){const r=w(t.sku,e),i=w(t.name,n);if(!r||!i)return null;const s={sku:r,name:i},a=w(t.brand);a&&(s.brand=a);const o=w(t.url);o&&(s.url=o);const c=vn(t.images);if(c.length>0)s.images=c;else{const m=w(t.image,t.image_url,t.imageUrl);m&&(s.images=[m])}const d=X(t.price_discounted);d!==void 0&&(s.price_discounted=d);const p=X(t.price);p!==void 0&&(s.price=p);const v=X(t.rating);v!==void 0&&(s.rating=v);const C=X(t.review_count)??X(t.reviewCount);C!==void 0&&(s.review_count=C);const T=w(t.cart_code,t.cartCode);return T&&(s.cart_code=T),typeof t.in_stock=="boolean"&&(s.in_stock=t.in_stock),typeof t.inStock=="boolean"&&(s.in_stock=t.inStock),L(s)}function P(t,e){const n=q(t);if(!n)return null;const r=n.type;if(typeof r!="string"||r.length===0)return null;const i={title:e||r,type:r};return n.payload!==void 0&&(i.payload=n.payload),i}function q(t){return!t||typeof t!="object"||Array.isArray(t)?null:t}function w(...t){for(const e of t)if(typeof e=="string"){const n=e.trim();if(n.length>0)return n}}function vn(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.length>0):[]}function X(t){if(typeof t=="number"&&Number.isFinite(t))return t;if(typeof t=="string"){const e=t.replace(",","."),n=Number(e);if(Number.isFinite(n))return n}}function Le(t){return t!=null}function L(t){const e=t.price_discounted!=null&&t.price_discounted>0?t.price_discounted:t.price,n=t.price_discounted!=null&&t.price_discounted>0&&t.price!=null?t.price:void 0;let r;n!=null&&e!=null&&n>0&&(r=Math.round((n-e)/n*100));const i=w(t.brand),s=w(t.name)??t.sku,a=i&&!s.startsWith(i)?`${i} ${s}`:s,o={sku:t.sku,name:a,url:w(t.url)??""},c=t.images?.[0];return c&&(o.imageUrl=c),t.images&&t.images.length>1&&(o.images=t.images),e!=null&&(o.price=String(e)),n!=null&&(o.originalPrice=String(n)),r!==void 0&&(o.discountPercent=r),i!==void 0&&(o.brand=i),t.rating!==void 0&&(o.rating=t.rating),t.review_count!==void 0&&(o.reviewCount=t.review_count),t.cart_code!==void 0&&(o.cartCode=t.cart_code),t.in_stock!==void 0&&(o.inStock=t.in_stock),t.variants&&t.variants.length>0&&(o.variants=t.variants),t.discount_reason!==void 0&&(o.discountReason=t.discount_reason),t.promotions&&t.promotions.length>0&&(o.promotions=t.promotions),o}function kn(t){return t.results.map(L)}function bn(t){return t.product_groupings.map(e=>{const n={name:e.name,products:(e.group_products??[]).map(L)};return e.highlight!==void 0&&(n.highlight=e.highlight),n})}function je(t){const e=t.headers.get("Content-Type")??"";return e.includes("application/x-ndjson")||e.includes("text/event-stream")}async function wn(t,e){const n=[],r={onEvent:i=>{const s=Ie(i);if(!(!s||s.type!=="ui_spec")){for(const a of Object.values(s.spec.elements))if(a.type==="ProductCard"&&a.props){const o=a.props.product??a.props;typeof o.sku=="string"&&typeof o.name=="string"&&n.push(o)}}}};return e!==void 0&&(r.signal=e),await Ae(t,r),n}async function xn(t,e,n){const r=Se("similar_products",e),i={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)};n!==void 0&&(i.signal=n);const s=await fetch(r,i);if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);if(je(s))return wn(s,n);const a=await s.text();return a?kn(JSON.parse(a)):[]}async function Cn(t,e){const n=[];let r=null;const i={onEvent:s=>{const a=Ie(s);if(a){if(a.type==="metadata"&&a.meta){const o=a.meta.group_name;if(typeof o=="string"){r={name:o,products:[]};const c=a.meta.highlight;typeof c=="string"&&(r.highlight=c),n.push(r)}}if(a.type==="ui_spec"&&r){for(const o of Object.values(a.spec.elements))if(o.type==="ProductCard"&&o.props){const c=o.props.product??o.props;typeof c.sku=="string"&&typeof c.name=="string"&&r.products.push(c)}}}}};return e!==void 0&&(i.signal=e),await Ae(t,i),n}async function Tn(t,e,n){const r=Se("product_groupings",e),i={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)};n!==void 0&&(i.signal=n);const s=await fetch(r,i);if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);if(je(s))return Cn(s,n);const a=await s.text();return a?bn(JSON.parse(a)):[]}function Ze(t){const{product:e,index:n,discountType:r,onClick:i,onAddToCart:s,renderCard:a}=t,o=t.i18n,c=o?.priceSuffix??" TL";if(a){const m=document.createElement("div");return m.className="gengage-simrel-card gengage-simrel-card--custom",m.innerHTML=a(e,n),m.addEventListener("click",E=>{E.target.closest(".gengage-simrel-atc")||i(e)}),m}const d=document.createElement("article");d.className="gengage-simrel-card",d.setAttribute("role","listitem"),d.dataset.sku=e.sku;const p=document.createElement("div");if(p.className="gengage-simrel-card-image",e.imageUrl){const m=document.createElement("img");m.src=e.imageUrl,m.alt=e.name,m.loading="lazy",p.appendChild(m)}if(r==="badge"&&e.discountPercent&&e.discountPercent>0){const m=document.createElement("span");m.className="gengage-simrel-badge",m.textContent=`%${e.discountPercent}`,p.appendChild(m)}d.appendChild(p);const v=document.createElement("div");if(v.className="gengage-simrel-card-info",e.brand){const m=document.createElement("div");m.className="gengage-simrel-card-brand",m.textContent=e.brand,v.appendChild(m)}const C=document.createElement("div");if(C.className="gengage-simrel-card-name",C.textContent=e.name,v.appendChild(C),e.rating!=null&&e.rating>0){const m=document.createElement("div");m.className="gengage-simrel-card-rating";const E="★".repeat(Math.round(e.rating))+"☆".repeat(5-Math.round(e.rating));if(m.textContent=E,e.reviewCount!=null){const G=document.createElement("span");G.className="gengage-simrel-card-review-count",G.textContent=` (${e.reviewCount})`,m.appendChild(G)}v.appendChild(m)}const T=document.createElement("div");if(T.className="gengage-simrel-card-price",e.originalPrice&&e.originalPrice!==e.price&&(r==="strike-through"||!r)){const m=document.createElement("span");m.className="gengage-simrel-card-price-original",m.textContent=e.originalPrice+c,T.appendChild(m)}if(e.price){const m=document.createElement("span");m.className="gengage-simrel-card-price-current",m.textContent=e.price+c,T.appendChild(m)}if(v.appendChild(T),d.appendChild(v),e.cartCode){const m=document.createElement("button");m.className="gengage-simrel-atc",m.type="button",m.textContent=o?.addToCartButton??"Sepete Ekle",m.addEventListener("click",E=>{E.stopPropagation(),s({sku:e.sku,quantity:1,cartCode:e.cartCode})}),d.appendChild(m)}return d.addEventListener("click",m=>{m.target.closest(".gengage-simrel-atc")||i(e)}),d}function $e(t){const e=document.createElement("div");e.className="gengage-simrel-grid",e.setAttribute("role","list"),e.setAttribute("aria-label",t.i18n?.similarProductsAriaLabel??"Similar products"),t.columns&&e.style.setProperty("--gengage-simrel-columns",String(t.columns));for(let n=0;n<t.products.length;n++){const i={product:t.products[n],index:n,onClick:t.onClick,onAddToCart:t.onAddToCart};t.i18n!==void 0&&(i.i18n=t.i18n),t.discountType!==void 0&&(i.discountType=t.discountType),t.renderCard!==void 0&&(i.renderCard=t.renderCard);const s=Ze(i);e.appendChild(s)}if(t.products.length===0){const n=document.createElement("div");n.className="gengage-simrel-empty",n.textContent=t.i18n?.emptyStateMessage??"Benzer ürün bulunamadı.",e.appendChild(n)}return e}function Sn(t){const e=document.createElement("div");if(e.className="gengage-simrel-groups",t.groups.length===0){const o=document.createElement("div");return o.className="gengage-simrel-empty",o.textContent=t.i18n?.emptyStateMessage??"Benzer ürün bulunamadı.",e.appendChild(o),e}const n=document.createElement("div");n.className="gengage-simrel-tabs",n.setAttribute("role","tablist");const r=document.createElement("div");r.className="gengage-simrel-tab-content";for(let o=0;o<t.groups.length;o++){const c=t.groups[o],d=document.createElement("button");d.className="gengage-simrel-tab",d.type="button",d.textContent=c.name,d.setAttribute("role","tab"),d.setAttribute("aria-selected",o===0?"true":"false"),o===0&&d.classList.add("gengage-simrel-tab--active"),d.addEventListener("click",()=>{const p=n.querySelector(".gengage-simrel-tab--active");p?.classList.remove("gengage-simrel-tab--active"),p?.setAttribute("aria-selected","false"),d.classList.add("gengage-simrel-tab--active"),d.setAttribute("aria-selected","true"),r.innerHTML="";const v={products:c.products,onClick:t.onClick,onAddToCart:t.onAddToCart};t.i18n!==void 0&&(v.i18n=t.i18n),t.discountType!==void 0&&(v.discountType=t.discountType),t.renderCard!==void 0&&(v.renderCard=t.renderCard);const C=$e(v);r.appendChild(C)}),n.appendChild(d)}e.appendChild(n);const s={products:t.groups[0].products,onClick:t.onClick,onAddToCart:t.onAddToCart};t.i18n!==void 0&&(s.i18n=t.i18n),t.discountType!==void 0&&(s.discountType=t.discountType),t.renderCard!==void 0&&(s.renderCard=t.renderCard);const a=$e(s);return r.appendChild(a),e.appendChild(r),e}function Me(t){if(!t||typeof t!="object")return null;const e=t;if(typeof e.sku!="string"||typeof e.name!="string"||typeof e.url!="string")return null;const n={sku:e.sku,name:e.name,url:e.url},r=e.imageUrl;typeof r=="string"&&(n.imageUrl=r);const i=e.price;typeof i=="string"&&(n.price=i);const s=e.originalPrice;typeof s=="string"&&(n.originalPrice=s);const a=e.discountPercent;typeof a=="number"&&(n.discountPercent=a);const o=e.brand;typeof o=="string"&&(n.brand=o);const c=e.rating;typeof c=="number"&&(n.rating=c);const d=e.reviewCount;typeof d=="number"&&(n.reviewCount=d);const p=e.cartCode;typeof p=="string"&&(n.cartCode=p);const v=e.inStock;return typeof v=="boolean"&&(n.inStock=v),n}function En(t){if(!t||typeof t!="object")return null;const e=t,n=e.title,r=e.type;if(typeof n!="string"||typeof r!="string")return null;const i={title:n,type:r};return e.payload!==void 0&&(i.payload=e.payload),i}const De={ProductGrid:({element:t,renderElement:e})=>{const n=document.createElement("div");n.className="gengage-simrel-grid",n.setAttribute("role","list");const r=t.props?.columns;typeof r=="number"&&Number.isFinite(r)&&r>0&&n.style.setProperty("--gengage-simrel-columns",String(r));for(const i of t.children??[]){const s=e(i);s&&n.appendChild(s)}if(n.children.length===0){const i=document.createElement("div");i.className="gengage-simrel-empty",i.textContent="Benzer ürün bulunamadı.",n.appendChild(i)}return n},ProductCard:({element:t,context:e})=>{const n=t.props?.product??t.props,r=Me(n);if(!r)return null;const i=t.props?.index,s=typeof i=="number"&&Number.isFinite(i)?i:0,a=t.props?.discountType,o=a==="strike-through"||a==="badge"?a:e.discountType,c={product:r,index:s,onClick:e.onClick,onAddToCart:e.onAddToCart,i18n:e.i18n};return o!==void 0&&(c.discountType=o),e.renderCard!==void 0&&(c.renderCard=e.renderCard),Ze(c)},GroupTabs:({element:t,context:e})=>{const n=t.props?.groups;if(!Array.isArray(n))return null;const r=[];for(const s of n){if(!s||typeof s!="object")continue;const a=s;if(typeof a.name!="string")continue;const o=[];if(Array.isArray(a.products))for(const d of a.products){const p=Me(d);p&&o.push(p)}const c={name:a.name,products:o};typeof a.highlight=="string"&&(c.highlight=a.highlight),r.push(c)}const i={groups:r,onClick:e.onClick,onAddToCart:e.onAddToCart,i18n:e.i18n};return e.discountType!==void 0&&(i.discountType=e.discountType),e.renderCard!==void 0&&(i.renderCard=e.renderCard),Sn(i)},EmptyState:({element:t,context:e})=>{const n=document.createElement("div");n.className="gengage-simrel-empty";const r=t.props?.message;return n.textContent=typeof r=="string"?r:e.i18n.emptyStateMessage,n},AddToCartButton:({element:t,context:e})=>{const n=t.props?.sku,r=t.props?.cartCode;if(typeof n!="string"||typeof r!="string")return null;const i=document.createElement("button");i.className="gengage-simrel-atc",i.type="button";const s=t.props?.label;return i.textContent=typeof s=="string"?s:e.i18n.addToCartButton,i.addEventListener("click",a=>{a.preventDefault(),a.stopPropagation(),e.onAddToCart({sku:n,quantity:1,cartCode:r})}),i},QuickActions:({element:t,context:e})=>{const n=document.createElement("div");n.className="gengage-simrel-quick-actions";const r=t.props?.actions;if(!Array.isArray(r)||!e.onAction)return n;for(const i of r){if(!i||typeof i!="object")continue;const s=i,a=s.label,o=En(s.action);if(typeof a!="string"||!o)continue;const c=document.createElement("button");c.className="gengage-simrel-quick-action",c.type="button",c.textContent=a,c.addEventListener("click",d=>{d.preventDefault(),d.stopPropagation(),e.onAction?.(o)}),n.appendChild(c)}return n}},le=({element:t,renderElement:e})=>{if(!t.children||t.children.length===0)return null;const n=document.createElement("div");for(const r of t.children){const i=e(r);i&&n.appendChild(i)}return n};function Ue(){return{...De}}function ze(t,e,n=De,r=le){return ut({spec:t,context:e,registry:n,containerClassName:"gengage-simrel-uispec",unknownRenderer:r})}const Ve={similarProductsAriaLabel:"Benzer ürünler",emptyStateMessage:"Benzer ürün bulunamadı.",addToCartButton:"Sepete Ekle",priceSuffix:" TL"},An={similarProductsAriaLabel:"Similar products",emptyStateMessage:"No similar products found.",addToCartButton:"Add to cart",priceSuffix:""};function In(t){return t?t.toLowerCase().split("-")[0]??"tr":"tr"}function Nn(t){return In(t)==="en"?An:Ve}var b;(function(t){t.assertEqual=i=>{};function e(i){}t.assertIs=e;function n(i){throw new Error}t.assertNever=n,t.arrayToEnum=i=>{const s={};for(const a of i)s[a]=a;return s},t.getValidEnumValues=i=>{const s=t.objectKeys(i).filter(o=>typeof i[i[o]]!="number"),a={};for(const o of s)a[o]=i[o];return t.objectValues(a)},t.objectValues=i=>t.objectKeys(i).map(function(s){return i[s]}),t.objectKeys=typeof Object.keys=="function"?i=>Object.keys(i):i=>{const s=[];for(const a in i)Object.prototype.hasOwnProperty.call(i,a)&&s.push(a);return s},t.find=(i,s)=>{for(const a of i)if(s(a))return a},t.isInteger=typeof Number.isInteger=="function"?i=>Number.isInteger(i):i=>typeof i=="number"&&Number.isFinite(i)&&Math.floor(i)===i;function r(i,s=" | "){return i.map(a=>typeof a=="string"?`'${a}'`:a).join(s)}t.joinValues=r,t.jsonStringifyReplacer=(i,s)=>typeof s=="bigint"?s.toString():s})(b||(b={}));var qe;(function(t){t.mergeShapes=(e,n)=>({...e,...n})})(qe||(qe={}));const f=b.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),j=t=>{switch(typeof t){case"undefined":return f.undefined;case"string":return f.string;case"number":return Number.isNaN(t)?f.nan:f.number;case"boolean":return f.boolean;case"function":return f.function;case"bigint":return f.bigint;case"symbol":return f.symbol;case"object":return Array.isArray(t)?f.array:t===null?f.null:t.then&&typeof t.then=="function"&&t.catch&&typeof t.catch=="function"?f.promise:typeof Map<"u"&&t instanceof Map?f.map:typeof Set<"u"&&t instanceof Set?f.set:typeof Date<"u"&&t instanceof Date?f.date:f.object;default:return f.unknown}},u=b.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class R extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=e}format(e){const n=e||function(s){return s.message},r={_errors:[]},i=s=>{for(const a of s.issues)if(a.code==="invalid_union")a.unionErrors.map(i);else if(a.code==="invalid_return_type")i(a.returnTypeError);else if(a.code==="invalid_arguments")i(a.argumentsError);else if(a.path.length===0)r._errors.push(n(a));else{let o=r,c=0;for(;c<a.path.length;){const d=a.path[c];c===a.path.length-1?(o[d]=o[d]||{_errors:[]},o[d]._errors.push(n(a))):o[d]=o[d]||{_errors:[]},o=o[d],c++}}};return i(this),r}static assert(e){if(!(e instanceof R))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,b.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=n=>n.message){const n={},r=[];for(const i of this.issues)if(i.path.length>0){const s=i.path[0];n[s]=n[s]||[],n[s].push(e(i))}else r.push(e(i));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}}R.create=t=>new R(t);const fe=(t,e)=>{let n;switch(t.code){case u.invalid_type:t.received===f.undefined?n="Required":n=`Expected ${t.expected}, received ${t.received}`;break;case u.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(t.expected,b.jsonStringifyReplacer)}`;break;case u.unrecognized_keys:n=`Unrecognized key(s) in object: ${b.joinValues(t.keys,", ")}`;break;case u.invalid_union:n="Invalid input";break;case u.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${b.joinValues(t.options)}`;break;case u.invalid_enum_value:n=`Invalid enum value. Expected ${b.joinValues(t.options)}, received '${t.received}'`;break;case u.invalid_arguments:n="Invalid function arguments";break;case u.invalid_return_type:n="Invalid function return type";break;case u.invalid_date:n="Invalid date";break;case u.invalid_string:typeof t.validation=="object"?"includes"in t.validation?(n=`Invalid input: must include "${t.validation.includes}"`,typeof t.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${t.validation.position}`)):"startsWith"in t.validation?n=`Invalid input: must start with "${t.validation.startsWith}"`:"endsWith"in t.validation?n=`Invalid input: must end with "${t.validation.endsWith}"`:b.assertNever(t.validation):t.validation!=="regex"?n=`Invalid ${t.validation}`:n="Invalid";break;case u.too_small:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at least":"more than"} ${t.minimum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at least":"over"} ${t.minimum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="bigint"?n=`Number must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${t.minimum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly equal to ":t.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(t.minimum))}`:n="Invalid input";break;case u.too_big:t.type==="array"?n=`Array must contain ${t.exact?"exactly":t.inclusive?"at most":"less than"} ${t.maximum} element(s)`:t.type==="string"?n=`String must contain ${t.exact?"exactly":t.inclusive?"at most":"under"} ${t.maximum} character(s)`:t.type==="number"?n=`Number must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="bigint"?n=`BigInt must be ${t.exact?"exactly":t.inclusive?"less than or equal to":"less than"} ${t.maximum}`:t.type==="date"?n=`Date must be ${t.exact?"exactly":t.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(t.maximum))}`:n="Invalid input";break;case u.custom:n="Invalid input";break;case u.invalid_intersection_types:n="Intersection results could not be merged";break;case u.not_multiple_of:n=`Number must be a multiple of ${t.multipleOf}`;break;case u.not_finite:n="Number must be finite";break;default:n=e.defaultError,b.assertNever(t)}return{message:n}};let Rn=fe;function On(){return Rn}const Pn=t=>{const{data:e,path:n,errorMaps:r,issueData:i}=t,s=[...n,...i.path||[]],a={...i,path:s};if(i.message!==void 0)return{...i,path:s,message:i.message};let o="";const c=r.filter(d=>!!d).slice().reverse();for(const d of c)o=d(a,{data:e,defaultError:o}).message;return{...i,path:s,message:o}};function l(t,e){const n=On(),r=Pn({issueData:e,data:t.data,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,n,n===fe?void 0:fe].filter(i=>!!i)});t.common.issues.push(r)}class A{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,n){const r=[];for(const i of n){if(i.status==="aborted")return g;i.status==="dirty"&&e.dirty(),r.push(i.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,n){const r=[];for(const i of n){const s=await i.key,a=await i.value;r.push({key:s,value:a})}return A.mergeObjectSync(e,r)}static mergeObjectSync(e,n){const r={};for(const i of n){const{key:s,value:a}=i;if(s.status==="aborted"||a.status==="aborted")return g;s.status==="dirty"&&e.dirty(),a.status==="dirty"&&e.dirty(),s.value!=="__proto__"&&(typeof a.value<"u"||i.alwaysSet)&&(r[s.value]=a.value)}return{status:e.value,value:r}}}const g=Object.freeze({status:"aborted"}),K=t=>({status:"dirty",value:t}),I=t=>({status:"valid",value:t}),Be=t=>t.status==="aborted",Ge=t=>t.status==="dirty",F=t=>t.status==="valid",re=t=>typeof Promise<"u"&&t instanceof Promise;var h;(function(t){t.errToObj=e=>typeof e=="string"?{message:e}:e||{},t.toString=e=>typeof e=="string"?e:e?.message})(h||(h={}));class Z{constructor(e,n,r,i){this._cachedPath=[],this.parent=e,this.data=n,this._path=r,this._key=i}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const Fe=(t,e)=>{if(F(e))return{success:!0,data:e.value};if(!t.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new R(t.common.issues);return this._error=n,this._error}}};function _(t){if(!t)return{};const{errorMap:e,invalid_type_error:n,required_error:r,description:i}=t;if(e&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:i}:{errorMap:(a,o)=>{const{message:c}=t;return a.code==="invalid_enum_value"?{message:c??o.defaultError}:typeof o.data>"u"?{message:c??r??o.defaultError}:a.code!=="invalid_type"?{message:o.defaultError}:{message:c??n??o.defaultError}},description:i}}class k{get description(){return this._def.description}_getType(e){return j(e.data)}_getOrReturnCtx(e,n){return n||{common:e.parent.common,data:e.data,parsedType:j(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new A,ctx:{common:e.parent.common,data:e.data,parsedType:j(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const n=this._parse(e);if(re(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(e){const n=this._parse(e);return Promise.resolve(n)}parse(e,n){const r=this.safeParse(e,n);if(r.success)return r.data;throw r.error}safeParse(e,n){const r={common:{issues:[],async:n?.async??!1,contextualErrorMap:n?.errorMap},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:j(e)},i=this._parseSync({data:e,path:r.path,parent:r});return Fe(r,i)}"~validate"(e){const n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:j(e)};if(!this["~standard"].async)try{const r=this._parseSync({data:e,path:[],parent:n});return F(r)?{value:r.value}:{issues:n.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:n}).then(r=>F(r)?{value:r.value}:{issues:n.common.issues})}async parseAsync(e,n){const r=await this.safeParseAsync(e,n);if(r.success)return r.data;throw r.error}async safeParseAsync(e,n){const r={common:{issues:[],contextualErrorMap:n?.errorMap,async:!0},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:j(e)},i=this._parse({data:e,path:r.path,parent:r}),s=await(re(i)?i:Promise.resolve(i));return Fe(r,s)}refine(e,n){const r=i=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(i):n;return this._refinement((i,s)=>{const a=e(i),o=()=>s.addIssue({code:u.custom,...r(i)});return typeof Promise<"u"&&a instanceof Promise?a.then(c=>c?!0:(o(),!1)):a?!0:(o(),!1)})}refinement(e,n){return this._refinement((r,i)=>e(r)?!0:(i.addIssue(typeof n=="function"?n(r,i):n),!1))}_refinement(e){return new Q({schema:this,typeName:y.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return D.create(this,this._def)}nullable(){return Y.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return N.create(this)}promise(){return oe.create(this,this._def)}or(e){return se.create([this,e],this._def)}and(e){return ae.create(this,e,this._def)}transform(e){return new Q({..._(this._def),schema:this,typeName:y.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const n=typeof e=="function"?e:()=>e;return new ge({..._(this._def),innerType:this,defaultValue:n,typeName:y.ZodDefault})}brand(){return new nr({typeName:y.ZodBranded,type:this,..._(this._def)})}catch(e){const n=typeof e=="function"?e:()=>e;return new ye({..._(this._def),innerType:this,catchValue:n,typeName:y.ZodCatch})}describe(e){const n=this.constructor;return new n({...this._def,description:e})}pipe(e){return _e.create(this,e)}readonly(){return ve.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const Ln=/^c[^\s-]{8,}$/i,jn=/^[0-9a-z]+$/,Zn=/^[0-9A-HJKMNP-TV-Z]{26}$/i,$n=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Mn=/^[a-z0-9_-]{21}$/i,Dn=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Un=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,zn=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,Vn="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let pe;const qn=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Bn=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Gn=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,Fn=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Hn=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Wn=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,He="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Jn=new RegExp(`^${He}$`);function We(t){let e="[0-5]\\d";t.precision?e=`${e}\\.\\d{${t.precision}}`:t.precision==null&&(e=`${e}(\\.\\d+)?`);const n=t.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${n}`}function Qn(t){return new RegExp(`^${We(t)}$`)}function Yn(t){let e=`${He}T${We(t)}`;const n=[];return n.push(t.local?"Z?":"Z"),t.offset&&n.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${n.join("|")})`,new RegExp(`^${e}$`)}function Xn(t,e){return!!((e==="v4"||!e)&&qn.test(t)||(e==="v6"||!e)&&Gn.test(t))}function Kn(t,e){if(!Dn.test(t))return!1;try{const[n]=t.split(".");if(!n)return!1;const r=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),i=JSON.parse(atob(r));return!(typeof i!="object"||i===null||"typ"in i&&i?.typ!=="JWT"||!i.alg||e&&i.alg!==e)}catch{return!1}}function er(t,e){return!!((e==="v4"||!e)&&Bn.test(t)||(e==="v6"||!e)&&Fn.test(t))}class $ extends k{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==f.string){const s=this._getOrReturnCtx(e);return l(s,{code:u.invalid_type,expected:f.string,received:s.parsedType}),g}const r=new A;let i;for(const s of this._def.checks)if(s.kind==="min")e.data.length<s.value&&(i=this._getOrReturnCtx(e,i),l(i,{code:u.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),r.dirty());else if(s.kind==="max")e.data.length>s.value&&(i=this._getOrReturnCtx(e,i),l(i,{code:u.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!1,message:s.message}),r.dirty());else if(s.kind==="length"){const a=e.data.length>s.value,o=e.data.length<s.value;(a||o)&&(i=this._getOrReturnCtx(e,i),a?l(i,{code:u.too_big,maximum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}):o&&l(i,{code:u.too_small,minimum:s.value,type:"string",inclusive:!0,exact:!0,message:s.message}),r.dirty())}else if(s.kind==="email")zn.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"email",code:u.invalid_string,message:s.message}),r.dirty());else if(s.kind==="emoji")pe||(pe=new RegExp(Vn,"u")),pe.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"emoji",code:u.invalid_string,message:s.message}),r.dirty());else if(s.kind==="uuid")$n.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"uuid",code:u.invalid_string,message:s.message}),r.dirty());else if(s.kind==="nanoid")Mn.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"nanoid",code:u.invalid_string,message:s.message}),r.dirty());else if(s.kind==="cuid")Ln.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"cuid",code:u.invalid_string,message:s.message}),r.dirty());else if(s.kind==="cuid2")jn.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"cuid2",code:u.invalid_string,message:s.message}),r.dirty());else if(s.kind==="ulid")Zn.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"ulid",code:u.invalid_string,message:s.message}),r.dirty());else if(s.kind==="url")try{new URL(e.data)}catch{i=this._getOrReturnCtx(e,i),l(i,{validation:"url",code:u.invalid_string,message:s.message}),r.dirty()}else s.kind==="regex"?(s.regex.lastIndex=0,s.regex.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"regex",code:u.invalid_string,message:s.message}),r.dirty())):s.kind==="trim"?e.data=e.data.trim():s.kind==="includes"?e.data.includes(s.value,s.position)||(i=this._getOrReturnCtx(e,i),l(i,{code:u.invalid_string,validation:{includes:s.value,position:s.position},message:s.message}),r.dirty()):s.kind==="toLowerCase"?e.data=e.data.toLowerCase():s.kind==="toUpperCase"?e.data=e.data.toUpperCase():s.kind==="startsWith"?e.data.startsWith(s.value)||(i=this._getOrReturnCtx(e,i),l(i,{code:u.invalid_string,validation:{startsWith:s.value},message:s.message}),r.dirty()):s.kind==="endsWith"?e.data.endsWith(s.value)||(i=this._getOrReturnCtx(e,i),l(i,{code:u.invalid_string,validation:{endsWith:s.value},message:s.message}),r.dirty()):s.kind==="datetime"?Yn(s).test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{code:u.invalid_string,validation:"datetime",message:s.message}),r.dirty()):s.kind==="date"?Jn.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{code:u.invalid_string,validation:"date",message:s.message}),r.dirty()):s.kind==="time"?Qn(s).test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{code:u.invalid_string,validation:"time",message:s.message}),r.dirty()):s.kind==="duration"?Un.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"duration",code:u.invalid_string,message:s.message}),r.dirty()):s.kind==="ip"?Xn(e.data,s.version)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"ip",code:u.invalid_string,message:s.message}),r.dirty()):s.kind==="jwt"?Kn(e.data,s.alg)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"jwt",code:u.invalid_string,message:s.message}),r.dirty()):s.kind==="cidr"?er(e.data,s.version)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"cidr",code:u.invalid_string,message:s.message}),r.dirty()):s.kind==="base64"?Hn.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"base64",code:u.invalid_string,message:s.message}),r.dirty()):s.kind==="base64url"?Wn.test(e.data)||(i=this._getOrReturnCtx(e,i),l(i,{validation:"base64url",code:u.invalid_string,message:s.message}),r.dirty()):b.assertNever(s);return{status:r.value,value:e.data}}_regex(e,n,r){return this.refinement(i=>e.test(i),{validation:n,code:u.invalid_string,...h.errToObj(r)})}_addCheck(e){return new $({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...h.errToObj(e)})}url(e){return this._addCheck({kind:"url",...h.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...h.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...h.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...h.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...h.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...h.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...h.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...h.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...h.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...h.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...h.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...h.errToObj(e)})}datetime(e){return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:e?.offset??!1,local:e?.local??!1,...h.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...h.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...h.errToObj(e)})}regex(e,n){return this._addCheck({kind:"regex",regex:e,...h.errToObj(n)})}includes(e,n){return this._addCheck({kind:"includes",value:e,position:n?.position,...h.errToObj(n?.message)})}startsWith(e,n){return this._addCheck({kind:"startsWith",value:e,...h.errToObj(n)})}endsWith(e,n){return this._addCheck({kind:"endsWith",value:e,...h.errToObj(n)})}min(e,n){return this._addCheck({kind:"min",value:e,...h.errToObj(n)})}max(e,n){return this._addCheck({kind:"max",value:e,...h.errToObj(n)})}length(e,n){return this._addCheck({kind:"length",value:e,...h.errToObj(n)})}nonempty(e){return this.min(1,h.errToObj(e))}trim(){return new $({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new $({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new $({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return!!this._def.checks.find(e=>e.kind==="date")}get isTime(){return!!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return!!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return!!this._def.checks.find(e=>e.kind==="email")}get isURL(){return!!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return!!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return!!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return!!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return!!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return!!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return!!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return!!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(const n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxLength(){let e=null;for(const n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e}}$.create=t=>new $({checks:[],typeName:y.ZodString,coerce:t?.coerce??!1,..._(t)});function tr(t,e){const n=(t.toString().split(".")[1]||"").length,r=(e.toString().split(".")[1]||"").length,i=n>r?n:r,s=Number.parseInt(t.toFixed(i).replace(".","")),a=Number.parseInt(e.toFixed(i).replace(".",""));return s%a/10**i}class H extends k{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==f.number){const s=this._getOrReturnCtx(e);return l(s,{code:u.invalid_type,expected:f.number,received:s.parsedType}),g}let r;const i=new A;for(const s of this._def.checks)s.kind==="int"?b.isInteger(e.data)||(r=this._getOrReturnCtx(e,r),l(r,{code:u.invalid_type,expected:"integer",received:"float",message:s.message}),i.dirty()):s.kind==="min"?(s.inclusive?e.data<s.value:e.data<=s.value)&&(r=this._getOrReturnCtx(e,r),l(r,{code:u.too_small,minimum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),i.dirty()):s.kind==="max"?(s.inclusive?e.data>s.value:e.data>=s.value)&&(r=this._getOrReturnCtx(e,r),l(r,{code:u.too_big,maximum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),i.dirty()):s.kind==="multipleOf"?tr(e.data,s.value)!==0&&(r=this._getOrReturnCtx(e,r),l(r,{code:u.not_multiple_of,multipleOf:s.value,message:s.message}),i.dirty()):s.kind==="finite"?Number.isFinite(e.data)||(r=this._getOrReturnCtx(e,r),l(r,{code:u.not_finite,message:s.message}),i.dirty()):b.assertNever(s);return{status:i.value,value:e.data}}gte(e,n){return this.setLimit("min",e,!0,h.toString(n))}gt(e,n){return this.setLimit("min",e,!1,h.toString(n))}lte(e,n){return this.setLimit("max",e,!0,h.toString(n))}lt(e,n){return this.setLimit("max",e,!1,h.toString(n))}setLimit(e,n,r,i){return new H({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:r,message:h.toString(i)}]})}_addCheck(e){return new H({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:h.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:h.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:h.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:h.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:h.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:h.toString(n)})}finite(e){return this._addCheck({kind:"finite",message:h.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:h.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:h.toString(e)})}get minValue(){let e=null;for(const n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(const n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e}get isInt(){return!!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&b.isInteger(e.value))}get isFinite(){let e=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(e===null||r.value<e)&&(e=r.value)}return Number.isFinite(n)&&Number.isFinite(e)}}H.create=t=>new H({checks:[],typeName:y.ZodNumber,coerce:t?.coerce||!1,..._(t)});class ee extends k{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data)}catch{return this._getInvalidInput(e)}if(this._getType(e)!==f.bigint)return this._getInvalidInput(e);let r;const i=new A;for(const s of this._def.checks)s.kind==="min"?(s.inclusive?e.data<s.value:e.data<=s.value)&&(r=this._getOrReturnCtx(e,r),l(r,{code:u.too_small,type:"bigint",minimum:s.value,inclusive:s.inclusive,message:s.message}),i.dirty()):s.kind==="max"?(s.inclusive?e.data>s.value:e.data>=s.value)&&(r=this._getOrReturnCtx(e,r),l(r,{code:u.too_big,type:"bigint",maximum:s.value,inclusive:s.inclusive,message:s.message}),i.dirty()):s.kind==="multipleOf"?e.data%s.value!==BigInt(0)&&(r=this._getOrReturnCtx(e,r),l(r,{code:u.not_multiple_of,multipleOf:s.value,message:s.message}),i.dirty()):b.assertNever(s);return{status:i.value,value:e.data}}_getInvalidInput(e){const n=this._getOrReturnCtx(e);return l(n,{code:u.invalid_type,expected:f.bigint,received:n.parsedType}),g}gte(e,n){return this.setLimit("min",e,!0,h.toString(n))}gt(e,n){return this.setLimit("min",e,!1,h.toString(n))}lte(e,n){return this.setLimit("max",e,!0,h.toString(n))}lt(e,n){return this.setLimit("max",e,!1,h.toString(n))}setLimit(e,n,r,i){return new ee({...this._def,checks:[...this._def.checks,{kind:e,value:n,inclusive:r,message:h.toString(i)}]})}_addCheck(e){return new ee({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:h.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:h.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:h.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:h.toString(e)})}multipleOf(e,n){return this._addCheck({kind:"multipleOf",value:e,message:h.toString(n)})}get minValue(){let e=null;for(const n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e}get maxValue(){let e=null;for(const n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e}}ee.create=t=>new ee({checks:[],typeName:y.ZodBigInt,coerce:t?.coerce??!1,..._(t)});class Je extends k{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==f.boolean){const r=this._getOrReturnCtx(e);return l(r,{code:u.invalid_type,expected:f.boolean,received:r.parsedType}),g}return I(e.data)}}Je.create=t=>new Je({typeName:y.ZodBoolean,coerce:t?.coerce||!1,..._(t)});class ie extends k{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==f.date){const s=this._getOrReturnCtx(e);return l(s,{code:u.invalid_type,expected:f.date,received:s.parsedType}),g}if(Number.isNaN(e.data.getTime())){const s=this._getOrReturnCtx(e);return l(s,{code:u.invalid_date}),g}const r=new A;let i;for(const s of this._def.checks)s.kind==="min"?e.data.getTime()<s.value&&(i=this._getOrReturnCtx(e,i),l(i,{code:u.too_small,message:s.message,inclusive:!0,exact:!1,minimum:s.value,type:"date"}),r.dirty()):s.kind==="max"?e.data.getTime()>s.value&&(i=this._getOrReturnCtx(e,i),l(i,{code:u.too_big,message:s.message,inclusive:!0,exact:!1,maximum:s.value,type:"date"}),r.dirty()):b.assertNever(s);return{status:r.value,value:new Date(e.data.getTime())}}_addCheck(e){return new ie({...this._def,checks:[...this._def.checks,e]})}min(e,n){return this._addCheck({kind:"min",value:e.getTime(),message:h.toString(n)})}max(e,n){return this._addCheck({kind:"max",value:e.getTime(),message:h.toString(n)})}get minDate(){let e=null;for(const n of this._def.checks)n.kind==="min"&&(e===null||n.value>e)&&(e=n.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(const n of this._def.checks)n.kind==="max"&&(e===null||n.value<e)&&(e=n.value);return e!=null?new Date(e):null}}ie.create=t=>new ie({checks:[],coerce:t?.coerce||!1,typeName:y.ZodDate,..._(t)});class Qe extends k{_parse(e){if(this._getType(e)!==f.symbol){const r=this._getOrReturnCtx(e);return l(r,{code:u.invalid_type,expected:f.symbol,received:r.parsedType}),g}return I(e.data)}}Qe.create=t=>new Qe({typeName:y.ZodSymbol,..._(t)});class Ye extends k{_parse(e){if(this._getType(e)!==f.undefined){const r=this._getOrReturnCtx(e);return l(r,{code:u.invalid_type,expected:f.undefined,received:r.parsedType}),g}return I(e.data)}}Ye.create=t=>new Ye({typeName:y.ZodUndefined,..._(t)});class Xe extends k{_parse(e){if(this._getType(e)!==f.null){const r=this._getOrReturnCtx(e);return l(r,{code:u.invalid_type,expected:f.null,received:r.parsedType}),g}return I(e.data)}}Xe.create=t=>new Xe({typeName:y.ZodNull,..._(t)});class Ke extends k{constructor(){super(...arguments),this._any=!0}_parse(e){return I(e.data)}}Ke.create=t=>new Ke({typeName:y.ZodAny,..._(t)});class he extends k{constructor(){super(...arguments),this._unknown=!0}_parse(e){return I(e.data)}}he.create=t=>new he({typeName:y.ZodUnknown,..._(t)});class M extends k{_parse(e){const n=this._getOrReturnCtx(e);return l(n,{code:u.invalid_type,expected:f.never,received:n.parsedType}),g}}M.create=t=>new M({typeName:y.ZodNever,..._(t)});class et extends k{_parse(e){if(this._getType(e)!==f.undefined){const r=this._getOrReturnCtx(e);return l(r,{code:u.invalid_type,expected:f.void,received:r.parsedType}),g}return I(e.data)}}et.create=t=>new et({typeName:y.ZodVoid,..._(t)});class N extends k{_parse(e){const{ctx:n,status:r}=this._processInputParams(e),i=this._def;if(n.parsedType!==f.array)return l(n,{code:u.invalid_type,expected:f.array,received:n.parsedType}),g;if(i.exactLength!==null){const a=n.data.length>i.exactLength.value,o=n.data.length<i.exactLength.value;(a||o)&&(l(n,{code:a?u.too_big:u.too_small,minimum:o?i.exactLength.value:void 0,maximum:a?i.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:i.exactLength.message}),r.dirty())}if(i.minLength!==null&&n.data.length<i.minLength.value&&(l(n,{code:u.too_small,minimum:i.minLength.value,type:"array",inclusive:!0,exact:!1,message:i.minLength.message}),r.dirty()),i.maxLength!==null&&n.data.length>i.maxLength.value&&(l(n,{code:u.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((a,o)=>i.type._parseAsync(new Z(n,a,n.path,o)))).then(a=>A.mergeArray(r,a));const s=[...n.data].map((a,o)=>i.type._parseSync(new Z(n,a,n.path,o)));return A.mergeArray(r,s)}get element(){return this._def.type}min(e,n){return new N({...this._def,minLength:{value:e,message:h.toString(n)}})}max(e,n){return new N({...this._def,maxLength:{value:e,message:h.toString(n)}})}length(e,n){return new N({...this._def,exactLength:{value:e,message:h.toString(n)}})}nonempty(e){return this.min(1,e)}}N.create=(t,e)=>new N({type:t,minLength:null,maxLength:null,exactLength:null,typeName:y.ZodArray,..._(e)});function W(t){if(t instanceof x){const e={};for(const n in t.shape){const r=t.shape[n];e[n]=D.create(W(r))}return new x({...t._def,shape:()=>e})}else return t instanceof N?new N({...t._def,type:W(t.element)}):t instanceof D?D.create(W(t.unwrap())):t instanceof Y?Y.create(W(t.unwrap())):t instanceof B?B.create(t.items.map(e=>W(e))):t}class x extends k{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const e=this._def.shape(),n=b.objectKeys(e);return this._cached={shape:e,keys:n},this._cached}_parse(e){if(this._getType(e)!==f.object){const d=this._getOrReturnCtx(e);return l(d,{code:u.invalid_type,expected:f.object,received:d.parsedType}),g}const{status:r,ctx:i}=this._processInputParams(e),{shape:s,keys:a}=this._getCached(),o=[];if(!(this._def.catchall instanceof M&&this._def.unknownKeys==="strip"))for(const d in i.data)a.includes(d)||o.push(d);const c=[];for(const d of a){const p=s[d],v=i.data[d];c.push({key:{status:"valid",value:d},value:p._parse(new Z(i,v,i.path,d)),alwaysSet:d in i.data})}if(this._def.catchall instanceof M){const d=this._def.unknownKeys;if(d==="passthrough")for(const p of o)c.push({key:{status:"valid",value:p},value:{status:"valid",value:i.data[p]}});else if(d==="strict")o.length>0&&(l(i,{code:u.unrecognized_keys,keys:o}),r.dirty());else if(d!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const d=this._def.catchall;for(const p of o){const v=i.data[p];c.push({key:{status:"valid",value:p},value:d._parse(new Z(i,v,i.path,p)),alwaysSet:p in i.data})}}return i.common.async?Promise.resolve().then(async()=>{const d=[];for(const p of c){const v=await p.key,C=await p.value;d.push({key:v,value:C,alwaysSet:p.alwaysSet})}return d}).then(d=>A.mergeObjectSync(r,d)):A.mergeObjectSync(r,c)}get shape(){return this._def.shape()}strict(e){return h.errToObj,new x({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(n,r)=>{const i=this._def.errorMap?.(n,r).message??r.defaultError;return n.code==="unrecognized_keys"?{message:h.errToObj(e).message??i}:{message:i}}}:{}})}strip(){return new x({...this._def,unknownKeys:"strip"})}passthrough(){return new x({...this._def,unknownKeys:"passthrough"})}extend(e){return new x({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new x({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:y.ZodObject})}setKey(e,n){return this.augment({[e]:n})}catchall(e){return new x({...this._def,catchall:e})}pick(e){const n={};for(const r of b.objectKeys(e))e[r]&&this.shape[r]&&(n[r]=this.shape[r]);return new x({...this._def,shape:()=>n})}omit(e){const n={};for(const r of b.objectKeys(this.shape))e[r]||(n[r]=this.shape[r]);return new x({...this._def,shape:()=>n})}deepPartial(){return W(this)}partial(e){const n={};for(const r of b.objectKeys(this.shape)){const i=this.shape[r];e&&!e[r]?n[r]=i:n[r]=i.optional()}return new x({...this._def,shape:()=>n})}required(e){const n={};for(const r of b.objectKeys(this.shape))if(e&&!e[r])n[r]=this.shape[r];else{let s=this.shape[r];for(;s instanceof D;)s=s._def.innerType;n[r]=s}return new x({...this._def,shape:()=>n})}keyof(){return it(b.objectKeys(this.shape))}}x.create=(t,e)=>new x({shape:()=>t,unknownKeys:"strip",catchall:M.create(),typeName:y.ZodObject,..._(e)}),x.strictCreate=(t,e)=>new x({shape:()=>t,unknownKeys:"strict",catchall:M.create(),typeName:y.ZodObject,..._(e)}),x.lazycreate=(t,e)=>new x({shape:t,unknownKeys:"strip",catchall:M.create(),typeName:y.ZodObject,..._(e)});class se extends k{_parse(e){const{ctx:n}=this._processInputParams(e),r=this._def.options;function i(s){for(const o of s)if(o.result.status==="valid")return o.result;for(const o of s)if(o.result.status==="dirty")return n.common.issues.push(...o.ctx.common.issues),o.result;const a=s.map(o=>new R(o.ctx.common.issues));return l(n,{code:u.invalid_union,unionErrors:a}),g}if(n.common.async)return Promise.all(r.map(async s=>{const a={...n,common:{...n.common,issues:[]},parent:null};return{result:await s._parseAsync({data:n.data,path:n.path,parent:a}),ctx:a}})).then(i);{let s;const a=[];for(const c of r){const d={...n,common:{...n.common,issues:[]},parent:null},p=c._parseSync({data:n.data,path:n.path,parent:d});if(p.status==="valid")return p;p.status==="dirty"&&!s&&(s={result:p,ctx:d}),d.common.issues.length&&a.push(d.common.issues)}if(s)return n.common.issues.push(...s.ctx.common.issues),s.result;const o=a.map(c=>new R(c));return l(n,{code:u.invalid_union,unionErrors:o}),g}}get options(){return this._def.options}}se.create=(t,e)=>new se({options:t,typeName:y.ZodUnion,..._(e)});function me(t,e){const n=j(t),r=j(e);if(t===e)return{valid:!0,data:t};if(n===f.object&&r===f.object){const i=b.objectKeys(e),s=b.objectKeys(t).filter(o=>i.indexOf(o)!==-1),a={...t,...e};for(const o of s){const c=me(t[o],e[o]);if(!c.valid)return{valid:!1};a[o]=c.data}return{valid:!0,data:a}}else if(n===f.array&&r===f.array){if(t.length!==e.length)return{valid:!1};const i=[];for(let s=0;s<t.length;s++){const a=t[s],o=e[s],c=me(a,o);if(!c.valid)return{valid:!1};i.push(c.data)}return{valid:!0,data:i}}else return n===f.date&&r===f.date&&+t==+e?{valid:!0,data:t}:{valid:!1}}class ae extends k{_parse(e){const{status:n,ctx:r}=this._processInputParams(e),i=(s,a)=>{if(Be(s)||Be(a))return g;const o=me(s.value,a.value);return o.valid?((Ge(s)||Ge(a))&&n.dirty(),{status:n.value,value:o.data}):(l(r,{code:u.invalid_intersection_types}),g)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([s,a])=>i(s,a)):i(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}ae.create=(t,e,n)=>new ae({left:t,right:e,typeName:y.ZodIntersection,..._(n)});class B extends k{_parse(e){const{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==f.array)return l(r,{code:u.invalid_type,expected:f.array,received:r.parsedType}),g;if(r.data.length<this._def.items.length)return l(r,{code:u.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),g;!this._def.rest&&r.data.length>this._def.items.length&&(l(r,{code:u.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const s=[...r.data].map((a,o)=>{const c=this._def.items[o]||this._def.rest;return c?c._parse(new Z(r,a,r.path,o)):null}).filter(a=>!!a);return r.common.async?Promise.all(s).then(a=>A.mergeArray(n,a)):A.mergeArray(n,s)}get items(){return this._def.items}rest(e){return new B({...this._def,rest:e})}}B.create=(t,e)=>{if(!Array.isArray(t))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new B({items:t,typeName:y.ZodTuple,rest:null,..._(e)})};class tt extends k{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==f.map)return l(r,{code:u.invalid_type,expected:f.map,received:r.parsedType}),g;const i=this._def.keyType,s=this._def.valueType,a=[...r.data.entries()].map(([o,c],d)=>({key:i._parse(new Z(r,o,r.path,[d,"key"])),value:s._parse(new Z(r,c,r.path,[d,"value"]))}));if(r.common.async){const o=new Map;return Promise.resolve().then(async()=>{for(const c of a){const d=await c.key,p=await c.value;if(d.status==="aborted"||p.status==="aborted")return g;(d.status==="dirty"||p.status==="dirty")&&n.dirty(),o.set(d.value,p.value)}return{status:n.value,value:o}})}else{const o=new Map;for(const c of a){const d=c.key,p=c.value;if(d.status==="aborted"||p.status==="aborted")return g;(d.status==="dirty"||p.status==="dirty")&&n.dirty(),o.set(d.value,p.value)}return{status:n.value,value:o}}}}tt.create=(t,e,n)=>new tt({valueType:e,keyType:t,typeName:y.ZodMap,..._(n)});class te extends k{_parse(e){const{status:n,ctx:r}=this._processInputParams(e);if(r.parsedType!==f.set)return l(r,{code:u.invalid_type,expected:f.set,received:r.parsedType}),g;const i=this._def;i.minSize!==null&&r.data.size<i.minSize.value&&(l(r,{code:u.too_small,minimum:i.minSize.value,type:"set",inclusive:!0,exact:!1,message:i.minSize.message}),n.dirty()),i.maxSize!==null&&r.data.size>i.maxSize.value&&(l(r,{code:u.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),n.dirty());const s=this._def.valueType;function a(c){const d=new Set;for(const p of c){if(p.status==="aborted")return g;p.status==="dirty"&&n.dirty(),d.add(p.value)}return{status:n.value,value:d}}const o=[...r.data.values()].map((c,d)=>s._parse(new Z(r,c,r.path,d)));return r.common.async?Promise.all(o).then(c=>a(c)):a(o)}min(e,n){return new te({...this._def,minSize:{value:e,message:h.toString(n)}})}max(e,n){return new te({...this._def,maxSize:{value:e,message:h.toString(n)}})}size(e,n){return this.min(e,n).max(e,n)}nonempty(e){return this.min(1,e)}}te.create=(t,e)=>new te({valueType:t,minSize:null,maxSize:null,typeName:y.ZodSet,..._(e)});class nt extends k{get schema(){return this._def.getter()}_parse(e){const{ctx:n}=this._processInputParams(e);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}nt.create=(t,e)=>new nt({getter:t,typeName:y.ZodLazy,..._(e)});class rt extends k{_parse(e){if(e.data!==this._def.value){const n=this._getOrReturnCtx(e);return l(n,{received:n.data,code:u.invalid_literal,expected:this._def.value}),g}return{status:"valid",value:e.data}}get value(){return this._def.value}}rt.create=(t,e)=>new rt({value:t,typeName:y.ZodLiteral,..._(e)});function it(t,e){return new J({values:t,typeName:y.ZodEnum,..._(e)})}class J extends k{_parse(e){if(typeof e.data!="string"){const n=this._getOrReturnCtx(e),r=this._def.values;return l(n,{expected:b.joinValues(r),received:n.parsedType,code:u.invalid_type}),g}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(e.data)){const n=this._getOrReturnCtx(e),r=this._def.values;return l(n,{received:n.data,code:u.invalid_enum_value,options:r}),g}return I(e.data)}get options(){return this._def.values}get enum(){const e={};for(const n of this._def.values)e[n]=n;return e}get Values(){const e={};for(const n of this._def.values)e[n]=n;return e}get Enum(){const e={};for(const n of this._def.values)e[n]=n;return e}extract(e,n=this._def){return J.create(e,{...this._def,...n})}exclude(e,n=this._def){return J.create(this.options.filter(r=>!e.includes(r)),{...this._def,...n})}}J.create=it;class st extends k{_parse(e){const n=b.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(e);if(r.parsedType!==f.string&&r.parsedType!==f.number){const i=b.objectValues(n);return l(r,{expected:b.joinValues(i),received:r.parsedType,code:u.invalid_type}),g}if(this._cache||(this._cache=new Set(b.getValidEnumValues(this._def.values))),!this._cache.has(e.data)){const i=b.objectValues(n);return l(r,{received:r.data,code:u.invalid_enum_value,options:i}),g}return I(e.data)}get enum(){return this._def.values}}st.create=(t,e)=>new st({values:t,typeName:y.ZodNativeEnum,..._(e)});class oe extends k{unwrap(){return this._def.type}_parse(e){const{ctx:n}=this._processInputParams(e);if(n.parsedType!==f.promise&&n.common.async===!1)return l(n,{code:u.invalid_type,expected:f.promise,received:n.parsedType}),g;const r=n.parsedType===f.promise?n.data:Promise.resolve(n.data);return I(r.then(i=>this._def.type.parseAsync(i,{path:n.path,errorMap:n.common.contextualErrorMap})))}}oe.create=(t,e)=>new oe({type:t,typeName:y.ZodPromise,..._(e)});class Q extends k{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===y.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:n,ctx:r}=this._processInputParams(e),i=this._def.effect||null,s={addIssue:a=>{l(r,a),a.fatal?n.abort():n.dirty()},get path(){return r.path}};if(s.addIssue=s.addIssue.bind(s),i.type==="preprocess"){const a=i.transform(r.data,s);if(r.common.async)return Promise.resolve(a).then(async o=>{if(n.value==="aborted")return g;const c=await this._def.schema._parseAsync({data:o,path:r.path,parent:r});return c.status==="aborted"?g:c.status==="dirty"||n.value==="dirty"?K(c.value):c});{if(n.value==="aborted")return g;const o=this._def.schema._parseSync({data:a,path:r.path,parent:r});return o.status==="aborted"?g:o.status==="dirty"||n.value==="dirty"?K(o.value):o}}if(i.type==="refinement"){const a=o=>{const c=i.refinement(o,s);if(r.common.async)return Promise.resolve(c);if(c instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?g:(o.status==="dirty"&&n.dirty(),a(o.value),{status:n.value,value:o.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>o.status==="aborted"?g:(o.status==="dirty"&&n.dirty(),a(o.value).then(()=>({status:n.value,value:o.value}))))}if(i.type==="transform")if(r.common.async===!1){const a=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!F(a))return g;const o=i.transform(a.value,s);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:o}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(a=>F(a)?Promise.resolve(i.transform(a.value,s)).then(o=>({status:n.value,value:o})):g);b.assertNever(i)}}Q.create=(t,e,n)=>new Q({schema:t,typeName:y.ZodEffects,effect:e,..._(n)}),Q.createWithPreprocess=(t,e,n)=>new Q({schema:e,effect:{type:"preprocess",transform:t},typeName:y.ZodEffects,..._(n)});class D extends k{_parse(e){return this._getType(e)===f.undefined?I(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}D.create=(t,e)=>new D({innerType:t,typeName:y.ZodOptional,..._(e)});class Y extends k{_parse(e){return this._getType(e)===f.null?I(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}Y.create=(t,e)=>new Y({innerType:t,typeName:y.ZodNullable,..._(e)});class ge extends k{_parse(e){const{ctx:n}=this._processInputParams(e);let r=n.data;return n.parsedType===f.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}ge.create=(t,e)=>new ge({innerType:t,typeName:y.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,..._(e)});class ye extends k{_parse(e){const{ctx:n}=this._processInputParams(e),r={...n,common:{...n.common,issues:[]}},i=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return re(i)?i.then(s=>({status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new R(r.common.issues)},input:r.data})})):{status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new R(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}ye.create=(t,e)=>new ye({innerType:t,typeName:y.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,..._(e)});class at extends k{_parse(e){if(this._getType(e)!==f.nan){const r=this._getOrReturnCtx(e);return l(r,{code:u.invalid_type,expected:f.nan,received:r.parsedType}),g}return{status:"valid",value:e.data}}}at.create=t=>new at({typeName:y.ZodNaN,..._(t)});class nr extends k{_parse(e){const{ctx:n}=this._processInputParams(e),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}}class _e extends k{_parse(e){const{status:n,ctx:r}=this._processInputParams(e);if(r.common.async)return(async()=>{const s=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?g:s.status==="dirty"?(n.dirty(),K(s.value)):this._def.out._parseAsync({data:s.value,path:r.path,parent:r})})();{const i=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?g:i.status==="dirty"?(n.dirty(),{status:"dirty",value:i.value}):this._def.out._parseSync({data:i.value,path:r.path,parent:r})}}static create(e,n){return new _e({in:e,out:n,typeName:y.ZodPipeline})}}class ve extends k{_parse(e){const n=this._def.innerType._parse(e),r=i=>(F(i)&&(i.value=Object.freeze(i.value)),i);return re(n)?n.then(i=>r(i)):r(n)}unwrap(){return this._def.innerType}}ve.create=(t,e)=>new ve({innerType:t,typeName:y.ZodReadonly,..._(e)});var y;(function(t){t.ZodString="ZodString",t.ZodNumber="ZodNumber",t.ZodNaN="ZodNaN",t.ZodBigInt="ZodBigInt",t.ZodBoolean="ZodBoolean",t.ZodDate="ZodDate",t.ZodSymbol="ZodSymbol",t.ZodUndefined="ZodUndefined",t.ZodNull="ZodNull",t.ZodAny="ZodAny",t.ZodUnknown="ZodUnknown",t.ZodNever="ZodNever",t.ZodVoid="ZodVoid",t.ZodArray="ZodArray",t.ZodObject="ZodObject",t.ZodUnion="ZodUnion",t.ZodDiscriminatedUnion="ZodDiscriminatedUnion",t.ZodIntersection="ZodIntersection",t.ZodTuple="ZodTuple",t.ZodRecord="ZodRecord",t.ZodMap="ZodMap",t.ZodSet="ZodSet",t.ZodFunction="ZodFunction",t.ZodLazy="ZodLazy",t.ZodLiteral="ZodLiteral",t.ZodEnum="ZodEnum",t.ZodEffects="ZodEffects",t.ZodNativeEnum="ZodNativeEnum",t.ZodOptional="ZodOptional",t.ZodNullable="ZodNullable",t.ZodDefault="ZodDefault",t.ZodCatch="ZodCatch",t.ZodPromise="ZodPromise",t.ZodBranded="ZodBranded",t.ZodPipeline="ZodPipeline",t.ZodReadonly="ZodReadonly"})(y||(y={}));const S=$.create,ne=H.create,rr=he.create;M.create;const ir=N.create,U=x.create;se.create,ae.create,B.create;const ot=J.create;oe.create,D.create,Y.create;const sr=U({sku:S(),name:S(),imageUrl:S().url().optional(),price:S().optional(),originalPrice:S().optional(),discountPercent:ne().optional(),url:S().url(),brand:S().optional(),rating:ne().min(0).max(5).optional(),reviewCount:ne().int().nonnegative().optional()}),ar=U({layout:ot(["grid","carousel"]).optional(),columns:ne().int().positive().optional()}),or=U({product:sr,index:ne().int().nonnegative(),discountType:ot(["strike-through","badge"]).optional()}),cr=U({sku:S(),label:S().optional(),cartCode:S()}),dr=U({actions:ir(U({label:S(),action:U({title:S(),type:S(),payload:rr().optional()})}))}),ur=U({message:S().optional()}),lr={components:{ProductGrid:{schema:ar,description:"Outer grid or carousel container for similar products."},ProductCard:{schema:or,description:"A single product card with image, title, price, and actions."},AddToCartButton:{schema:cr,description:"Add-to-cart CTA rendered inside or below a product card."},QuickActions:{schema:dr,description:"A row of quick-action buttons below product info."},EmptyState:{schema:ur,description:"Empty state shown when no similar products are available."}}};class ct extends Lt{constructor(){super(...arguments),this._abortController=null,this._contentEl=null,this._i18n=Ve}async onInit(e){this._i18n=this._resolveI18n(e),this._contentEl=document.createElement("div"),this._contentEl.className="gengage-simrel-container",this.root.appendChild(this._contentEl),this._lastSku=e.sku,await this._fetchAndRender(e.sku),this.isVisible=!0}onUpdate(e){const n=e.sku;!n||n===this._lastSku||(this._lastSku=n,this._fetchAndRender(n))}onShow(){this._contentEl&&(this._contentEl.style.opacity="0",this._contentEl.style.transition="opacity 0.3s ease-in",requestAnimationFrame(()=>{this._contentEl&&(this._contentEl.style.opacity="1")}))}onHide(){}onDestroy(){this._abort(),this._contentEl&&(this._contentEl.remove(),this._contentEl=null)}_handleProductClick(e){const n={sku:e.sku,name:e.name,url:e.url};if(e.imageUrl!==void 0&&(n.imageUrl=e.imageUrl),e.price!==void 0&&(n.price=e.price),e.originalPrice!==void 0&&(n.originalPrice=e.originalPrice),e.discountPercent!==void 0&&(n.discountPercent=e.discountPercent),e.brand!==void 0&&(n.brand=e.brand),e.rating!==void 0&&(n.rating=e.rating),e.reviewCount!==void 0&&(n.reviewCount=e.reviewCount),e.cartCode!==void 0&&(n.cartCode=e.cartCode),e.inStock!==void 0&&(n.inStock=e.inStock),this.config.onProductClick?.(n)===!1)return;const r=this.config.session?.sessionId??null;ce("gengage:similar:product-click",{sku:e.sku,url:e.url,sessionId:r}),this.config.onProductNavigate?.(e.url,e.sku,r)}_handleAddToCart(e){this.config.onAddToCart?.(e),ce("gengage:similar:add-to-cart",e),this.track(yt(this.analyticsContext(),{attribution_source:"simrel",attribution_action_id:crypto.randomUUID(),cart_value:0,currency:"TRY",line_items:e.quantity,sku:e.sku}))}_abort(){this._abortController?.abort(),this._abortController=null}async _fetchAndRender(e){if(this._abort(),this._abortController=new AbortController,!this._contentEl)return;this._contentEl.innerHTML="";const n=document.createElement("div");n.className="gengage-simrel-loading";const r=document.createElement("div");r.className="gengage-simrel-spinner",n.appendChild(r),this._contentEl.appendChild(n);const i={middlewareUrl:this.config.middlewareUrl},s=crypto.randomUUID(),a=Date.now();this.track(ft(this.analyticsContext(),{endpoint:"similar_products",request_id:s,widget:"simrel"}));try{const o={account_id:this.config.accountId,session_id:this.config.session?.sessionId??"",correlation_id:this.config.session?.sessionId??"",sku:e};this.config.domain!==void 0&&(o.domain=this.config.domain);const c=await xn(o,i,this._abortController.signal);if(!this._contentEl)return;if(this._contentEl.innerHTML="",c.length>0)try{const d=c.map(v=>v.sku),p=await Tn({account_id:this.config.accountId,session_id:this.config.session?.sessionId??"",correlation_id:this.config.session?.sessionId??"",skus:d},i,this._abortController.signal);if(p.length>0&&this._contentEl){const v=this._buildGroupsSpec(p),C=this._renderUISpec(v);this._contentEl.appendChild(C);return}}catch{}if(this._contentEl){const d=this._buildProductsSpec(c),p=this._renderUISpec(d);this._contentEl.appendChild(p)}this.track(pt(this.analyticsContext(),{request_id:s,latency_ms:Date.now()-a,chunk_count:c.length,widget:"simrel"})),this.track(gt(this.analyticsContext(),{message_count:c.length,history_ref:s,redaction_level:"none",widget:"simrel"}))}catch(o){if(o instanceof DOMException&&o.name==="AbortError")return;ce("gengage:global:error",{source:"simrel",code:"FETCH_ERROR",message:St(this.config.locale)}),this.track(ht(this.analyticsContext(),{request_id:s,error_code:"FETCH_ERROR",error_message:o instanceof Error?o.message:String(o),widget:"simrel"})),this._contentEl&&(this._contentEl.innerHTML="",this._contentEl.style.display="none")}}_resolveI18n(e){return{...Nn(e.locale),...e.i18n}}_resolveUISpecRegistry(){const e=Ue();return lt(e,this.config.renderer?.registry)}_buildRenderContext(){const e=this.config.renderCard,n={onClick:r=>this._handleProductClick(r),onAddToCart:r=>this._handleAddToCart(r),i18n:this._i18n};return this.config.discountType!==void 0&&(n.discountType=this.config.discountType),e!==void 0&&(n.renderCard=e),n}_renderUISpec(e){const n=this._resolveUISpecRegistry(),r=this._buildRenderContext(),i=this.config.renderer?.unknownRenderer??le,s=(c,d)=>ze(c,d,n,i),a=this.config.renderer?.renderUISpec;return a?a(e,r,{registry:n,unknownRenderer:i,defaultRender:s}):s(e,r)}_buildProductsSpec(e){const n={},r=[];for(let i=0;i<e.length;i++){const s=e[i],a=`product-${i}`;r.push(a),n[a]={type:"ProductCard",props:{product:s,index:i,discountType:this.config.discountType}}}return n.root={type:"ProductGrid",props:{layout:"grid"},children:r},{root:"root",elements:n}}_buildGroupsSpec(e){return{root:"root",elements:{root:{type:"GroupTabs",props:{groups:e}}}}}}function fr(){return new ct}z.GengageSimRel=ct,z.createDefaultSimRelUISpecRegistry=Ue,z.createSimRelWidget=fr,z.defaultSimRelUnknownUISpecRenderer=le,z.renderSimRelUISpec=ze,z.simRelCatalog=lr,Object.defineProperty(z,Symbol.toStringTag,{value:"Module"})})(this.Gengage=this.Gengage||{});
|
|
48
|
+
//# sourceMappingURL=simrel.iife.js.map
|