@zevcommerce/theme-starter 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/settings.ts","../src/sections/Header.tsx","../src/sections/Announcement.tsx","../src/sections/Hero.tsx","../src/sections/FeaturedProducts.tsx","../src/sections/ContactInfo.tsx","../src/sections/Footer.tsx","../src/sections/ProductDetail.tsx","../src/helpers/format-price.ts","../src/sections/ProductList.tsx","../src/sections/CartSection.tsx","../src/sections/CheckoutSection.tsx","../src/registry.ts","../src/preset.json"],"sourcesContent":["import { defineTheme } from '@zevcommerce/theme-sdk';\nimport { settingsSchema } from './settings';\nimport { starterSectionRegistry, starterBlockRegistry } from './registry';\nimport preset from './preset.json';\n\nconst theme = defineTheme({\n handle: 'starter',\n name: 'Starter',\n version: '1.0.0',\n author: {\n name: 'ZevCommerce',\n url: 'https://zevcommerce.com',\n },\n description: 'A simple, mobile-first theme for ZevCommerce — perfect for getting started quickly.',\n tags: ['simple', 'mobile-first', 'starter', 'minimal', 'responsive'],\n settingsSchema,\n defaultPreset: preset as any,\n registry: {\n sections: starterSectionRegistry,\n blocks: starterBlockRegistry,\n },\n});\n\nexport default theme;\nexport { settingsSchema } from './settings';\nexport { starterSectionRegistry, starterBlockRegistry } from './registry';\n","import { defineSettings } from '@zevcommerce/theme-sdk';\n\nexport const settingsSchema = defineSettings([\n // ============================================================\n // BRAND\n // ============================================================\n {\n name: 'Brand',\n icon: 'palette',\n settings: [\n { type: 'color', id: 'brand.primary', label: 'Primary Color', default: '#2563EB' },\n { type: 'color', id: 'brand.background', label: 'Background Color', default: '#ffffff' },\n { type: 'color', id: 'brand.text', label: 'Text Color', default: '#374151' },\n { type: 'color', id: 'brand.accent', label: 'Accent Color', default: '#F59E0B' },\n {\n type: 'select',\n id: 'brand.font',\n label: 'Body Font',\n default: 'Inter',\n options: [\n { value: 'Inter', label: 'Inter' },\n { value: 'Roboto', label: 'Roboto' },\n { value: 'Open Sans', label: 'Open Sans' },\n { value: 'Poppins', label: 'Poppins' },\n { value: 'Lato', label: 'Lato' },\n ],\n },\n ],\n },\n\n // ============================================================\n // HEADER\n // ============================================================\n {\n name: 'Header',\n icon: 'layout',\n settings: [\n { type: 'image', id: 'header.logo', label: 'Logo Image' },\n { type: 'range', id: 'header.logoHeight', label: 'Logo Height (px)', min: 20, max: 80, step: 4, default: 36 },\n { type: 'checkbox', id: 'header.sticky', label: 'Sticky Header', default: true },\n { type: 'checkbox', id: 'header.showSearch', label: 'Show Search Icon', default: true },\n { type: 'text', id: 'header.menuHandle', label: 'Menu Handle', default: 'main-menu' },\n ],\n },\n\n // ============================================================\n // HERO BANNER\n // ============================================================\n {\n name: 'Hero Banner',\n icon: 'image',\n settings: [\n { type: 'checkbox', id: 'hero.enabled', label: 'Show Hero', default: true },\n { type: 'image', id: 'hero.backgroundImage', label: 'Background Image' },\n { type: 'text', id: 'hero.heading', label: 'Heading', default: 'Welcome to our store' },\n { type: 'textarea', id: 'hero.subheading', label: 'Subheading', default: 'Discover amazing products at great prices.' },\n { type: 'text', id: 'hero.buttonText', label: 'Button Text', default: 'Shop Now' },\n { type: 'text', id: 'hero.buttonLink', label: 'Button Link', default: '/collections/all' },\n { type: 'range', id: 'hero.overlayOpacity', label: 'Overlay Opacity', min: 0, max: 100, step: 5, default: 50 },\n { type: 'color', id: 'hero.overlayColor', label: 'Overlay Color', default: '#000000' },\n { type: 'color', id: 'hero.textColor', label: 'Text Color', default: '#ffffff' },\n ],\n },\n\n // ============================================================\n // PRODUCTS\n // ============================================================\n {\n name: 'Products',\n icon: 'shopping-bag',\n settings: [\n { type: 'checkbox', id: 'products.enabled', label: 'Show Featured Products', default: true },\n { type: 'text', id: 'products.heading', label: 'Section Heading', default: 'Featured Products' },\n { type: 'collection_picker', id: 'products.collection', label: 'Collection', default: 'all' },\n { type: 'range', id: 'products.limit', label: 'Number of Products', min: 4, max: 24, step: 4, default: 8 },\n {\n type: 'select',\n id: 'products.columns',\n label: 'Grid Columns (Desktop)',\n default: '4',\n options: [\n { value: '2', label: '2 Columns' },\n { value: '3', label: '3 Columns' },\n { value: '4', label: '4 Columns' },\n ],\n },\n ],\n },\n\n // ============================================================\n // CONTACT\n // ============================================================\n {\n name: 'Contact',\n icon: 'phone',\n settings: [\n { type: 'checkbox', id: 'contact.enabled', label: 'Show Contact Section', default: false },\n { type: 'text', id: 'contact.heading', label: 'Section Heading', default: 'Get in Touch' },\n { type: 'checkbox', id: 'contact.showPhone', label: 'Show Phone', default: true },\n { type: 'text', id: 'contact.phone', label: 'Phone Number', default: '' },\n { type: 'checkbox', id: 'contact.showEmail', label: 'Show Email', default: true },\n { type: 'text', id: 'contact.email', label: 'Email Address', default: '' },\n { type: 'checkbox', id: 'contact.showWhatsApp', label: 'Show WhatsApp', default: false },\n { type: 'text', id: 'contact.whatsapp', label: 'WhatsApp Number', default: '' },\n { type: 'checkbox', id: 'contact.showAddress', label: 'Show Address', default: false },\n { type: 'textarea', id: 'contact.address', label: 'Address', default: '' },\n ],\n },\n\n // ============================================================\n // FOOTER\n // ============================================================\n {\n name: 'Footer',\n icon: 'align-bottom',\n settings: [\n { type: 'textarea', id: 'footer.description', label: 'Store Description', default: '' },\n { type: 'text', id: 'footer.menuHandle', label: 'Footer Menu Handle', default: 'footer' },\n { type: 'text', id: 'footer.copyright', label: 'Copyright Text', default: '' },\n { type: 'text', id: 'footer.instagram', label: 'Instagram URL', default: '' },\n { type: 'text', id: 'footer.facebook', label: 'Facebook URL', default: '' },\n { type: 'text', id: 'footer.twitter', label: 'Twitter / X URL', default: '' },\n { type: 'text', id: 'footer.tiktok', label: 'TikTok URL', default: '' },\n ],\n },\n\n // ============================================================\n // ANNOUNCEMENT\n // ============================================================\n {\n name: 'Announcement',\n icon: 'megaphone',\n settings: [\n { type: 'checkbox', id: 'announcement.enabled', label: 'Show Announcement Bar', default: false },\n { type: 'text', id: 'announcement.text', label: 'Announcement Text', default: 'Free shipping on orders over $50!' },\n { type: 'color', id: 'announcement.backgroundColor', label: 'Background Color', default: '#2563EB' },\n { type: 'color', id: 'announcement.textColor', label: 'Text Color', default: '#ffffff' },\n ],\n },\n]);\n","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport Link from 'next/link';\nimport { useTheme, useCartStore, resolveMenuUrl, getStorePermalink, getProducts } from '@zevcommerce/storefront-api';\nimport { useRouter, useParams } from 'next/navigation';\n\nexport default function Header() {\n const { theme, storeConfig, menus } = useTheme();\n const { openCart, items } = useCartStore();\n const router = useRouter();\n const params = useParams();\n\n const header = theme?.settings?.header;\n const logoSrc = header?.logo || storeConfig?.storeLogo;\n const logoHeight = header?.logoHeight || 36;\n const sticky = header?.sticky !== false;\n const showSearch = header?.showSearch !== false;\n const menuHandle = header?.menuHandle || 'main-menu';\n\n const domain = (params?.domain as string) || storeConfig?.handle || '';\n const storeName = storeConfig?.name || 'Store';\n\n // Resolve menu\n const availableMenus = Object.values(menus || {});\n const defaultMenu = availableMenus.find((m: any) => m.isDefault);\n const activeMenu = (menuHandle && menus?.[menuHandle]) || defaultMenu || availableMenus[0];\n const menuItems = (activeMenu as any)?.items || [];\n\n // UI state\n const [mobileOpen, setMobileOpen] = useState(false);\n const [searchOpen, setSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [suggestions, setSuggestions] = useState<any[]>([]);\n const searchRef = useRef<HTMLInputElement>(null);\n\n const cartCount = items.reduce((sum, item) => sum + item.quantity, 0);\n\n // Lock body scroll\n useEffect(() => {\n document.body.style.overflow = (mobileOpen || searchOpen) ? 'hidden' : '';\n return () => { document.body.style.overflow = ''; };\n }, [mobileOpen, searchOpen]);\n\n // Focus search input\n useEffect(() => {\n if (searchOpen) searchRef.current?.focus();\n }, [searchOpen]);\n\n // Escape key handler\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setSearchOpen(false);\n setMobileOpen(false);\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, []);\n\n // Search suggestions\n useEffect(() => {\n const timer = setTimeout(async () => {\n if (searchQuery.length > 2) {\n try {\n const { data } = await getProducts(domain, 1, 5, searchQuery);\n setSuggestions(data);\n } catch {\n setSuggestions([]);\n }\n } else {\n setSuggestions([]);\n }\n }, 300);\n return () => clearTimeout(timer);\n }, [searchQuery, domain]);\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n if (!searchQuery.trim()) return;\n router.push(getStorePermalink(domain, `/search?q=${encodeURIComponent(searchQuery)}`));\n setSearchOpen(false);\n setSearchQuery('');\n setSuggestions([]);\n };\n\n return (\n <>\n <header\n style={{\n backgroundColor: 'var(--color-background)',\n borderBottom: '1px solid #e5e7eb',\n position: sticky ? 'sticky' : 'relative',\n top: 0,\n zIndex: 50,\n }}\n >\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"flex items-center justify-between h-16\">\n {/* Logo */}\n <Link href={getStorePermalink(domain, '/')} className=\"flex-shrink-0\">\n {logoSrc ? (\n <img\n src={logoSrc}\n alt={storeName}\n style={{ height: `${logoHeight}px`, width: 'auto', objectFit: 'contain' }}\n />\n ) : (\n <span\n className=\"text-xl font-bold\"\n style={{ color: 'var(--color-text)' }}\n >\n {storeName}\n </span>\n )}\n </Link>\n\n {/* Desktop Nav */}\n <nav className=\"hidden md:flex items-center gap-6\">\n {menuItems.map((item: any) => (\n <Link\n key={item.id}\n href={resolveMenuUrl(item, domain)}\n className=\"text-sm font-medium transition-colors hover:opacity-70\"\n style={{ color: 'var(--color-text)' }}\n >\n {item.title}\n </Link>\n ))}\n </nav>\n\n {/* Icons */}\n <div className=\"flex items-center gap-3\">\n {/* Search */}\n {showSearch && (\n <button\n onClick={() => setSearchOpen(true)}\n aria-label=\"Search\"\n className=\"p-2 transition-opacity hover:opacity-70\"\n style={{ color: 'var(--color-text)' }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n </button>\n )}\n\n {/* Cart */}\n <button\n onClick={openCart}\n aria-label=\"Cart\"\n className=\"relative p-2 transition-opacity hover:opacity-70\"\n style={{ color: 'var(--color-text)' }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 2L3 6v14a2 2 0 002 2h14a2 2 0 002-2V6l-3-4z\" />\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <path d=\"M16 10a4 4 0 01-8 0\" />\n </svg>\n {cartCount > 0 && (\n <span\n className=\"absolute -top-0.5 -right-0.5 text-[10px] font-bold min-w-[18px] h-[18px] flex items-center justify-center rounded-full px-1\"\n style={{ backgroundColor: 'var(--color-primary)', color: '#fff' }}\n >\n {cartCount}\n </span>\n )}\n </button>\n\n {/* Mobile hamburger */}\n <button\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open menu\"\n className=\"md:hidden p-2 transition-opacity hover:opacity-70\"\n style={{ color: 'var(--color-text)' }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </header>\n\n {/* Search Overlay */}\n {searchOpen && (\n <div\n className=\"fixed inset-0 z-[200] flex items-start justify-center pt-24\"\n style={{ backgroundColor: 'rgba(0,0,0,0.6)' }}\n onClick={(e) => { if (e.target === e.currentTarget) { setSearchOpen(false); setSuggestions([]); } }}\n >\n <div className=\"w-full max-w-lg mx-4 rounded-lg overflow-hidden\" style={{ backgroundColor: 'var(--color-background)' }}>\n <form onSubmit={handleSearch} className=\"flex items-center px-4 py-3 border-b\" style={{ borderColor: '#e5e7eb' }}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"mr-3 flex-shrink-0\" style={{ color: 'var(--color-text)', opacity: 0.4 }}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n <input\n ref={searchRef}\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search products...\"\n className=\"flex-1 text-sm outline-none bg-transparent\"\n style={{ color: 'var(--color-text)' }}\n />\n <button\n type=\"button\"\n onClick={() => { setSearchOpen(false); setSuggestions([]); setSearchQuery(''); }}\n className=\"p-1 ml-2\"\n style={{ color: 'var(--color-text)', opacity: 0.4 }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </form>\n {suggestions.length > 0 && (\n <div className=\"max-h-80 overflow-y-auto\">\n {suggestions.map((product) => (\n <Link\n key={product.id}\n href={getStorePermalink(domain, `/products/${product.slug}`)}\n onClick={() => { setSearchOpen(false); setSuggestions([]); setSearchQuery(''); }}\n className=\"flex items-center gap-3 px-4 py-3 transition-colors hover:bg-gray-50\"\n >\n {product.media?.[0]?.url && (\n <img src={product.media[0].url} alt={product.title} className=\"w-10 h-10 object-cover rounded\" />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\" style={{ color: 'var(--color-text)' }}>{product.title}</p>\n </div>\n </Link>\n ))}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Mobile Menu */}\n {mobileOpen && (\n <div className=\"fixed inset-0 z-[200] md:hidden\">\n <div\n className=\"absolute inset-0\"\n style={{ backgroundColor: 'rgba(0,0,0,0.5)' }}\n onClick={() => setMobileOpen(false)}\n />\n <div\n className=\"absolute left-0 top-0 bottom-0 w-[80%] max-w-[320px] flex flex-col\"\n style={{ backgroundColor: 'var(--color-background)' }}\n >\n {/* Mobile header */}\n <div className=\"flex items-center justify-between px-4 py-4 border-b\" style={{ borderColor: '#e5e7eb' }}>\n <Link href={getStorePermalink(domain, '/')} onClick={() => setMobileOpen(false)}>\n {logoSrc ? (\n <img src={logoSrc} alt={storeName} style={{ height: '28px', width: 'auto' }} />\n ) : (\n <span className=\"text-lg font-bold\" style={{ color: 'var(--color-text)' }}>{storeName}</span>\n )}\n </Link>\n <button\n onClick={() => setMobileOpen(false)}\n aria-label=\"Close menu\"\n className=\"p-1\"\n style={{ color: 'var(--color-text)' }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Links */}\n <nav className=\"flex-1 overflow-y-auto px-4 py-4\">\n {menuItems.map((item: any) => (\n <Link\n key={item.id}\n href={resolveMenuUrl(item, domain)}\n onClick={() => setMobileOpen(false)}\n className=\"block py-3 text-sm font-medium border-b transition-opacity hover:opacity-70\"\n style={{ color: 'var(--color-text)', borderColor: '#f3f4f6' }}\n >\n {item.title}\n </Link>\n ))}\n </nav>\n </div>\n </div>\n )}\n </>\n );\n}\n\nexport const schema = {\n type: 'header',\n name: 'Header',\n limit: 1,\n settings: [],\n};\n","'use client';\n\nimport { useTheme } from '@zevcommerce/storefront-api';\n\nexport default function Announcement() {\n const { theme } = useTheme();\n const announcement = theme?.settings?.announcement;\n\n if (!announcement?.enabled) return null;\n\n const text = announcement.text || 'Free shipping on orders over $50!';\n const backgroundColor = announcement.backgroundColor || '#2563EB';\n const textColor = announcement.textColor || '#ffffff';\n\n return (\n <div\n className=\"py-2.5 text-center\"\n style={{ backgroundColor, color: textColor, fontFamily: 'var(--font-body)' }}\n >\n <p className=\"text-xs sm:text-sm font-medium px-4\">{text}</p>\n </div>\n );\n}\n\nexport const schema = {\n type: 'announcement',\n name: 'Announcement Bar',\n limit: 1,\n settings: [],\n};\n","'use client';\n\nimport Link from 'next/link';\nimport { useTheme, getStorePermalink } from '@zevcommerce/storefront-api';\nimport { useParams } from 'next/navigation';\n\nexport default function Hero() {\n const { theme, storeConfig } = useTheme();\n const params = useParams();\n const domain = (params?.domain as string) || storeConfig?.handle || '';\n\n const hero = theme?.settings?.hero;\n if (!hero?.enabled) return null;\n\n const heading = hero.heading || 'Welcome to our store';\n const subheading = hero.subheading || '';\n const buttonText = hero.buttonText || 'Shop Now';\n const buttonLink = hero.buttonLink || '/collections/all';\n const overlayOpacity = (hero.overlayOpacity ?? 50) / 100;\n const overlayColor = hero.overlayColor || '#000000';\n const textColor = hero.textColor || '#ffffff';\n\n const resolveImage = (img: any) => {\n if (!img) return undefined;\n if (typeof img === 'string') return img;\n if (typeof img === 'object' && img.url) return img.url;\n return undefined;\n };\n\n const bgImage = resolveImage(hero.backgroundImage);\n\n return (\n <section\n className=\"relative flex items-center justify-center min-h-[60vh] md:min-h-[75vh]\"\n style={{\n backgroundImage: bgImage ? `url(\"${bgImage}\")` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundColor: !bgImage ? '#1f2937' : undefined,\n }}\n >\n {/* Overlay */}\n <div\n className=\"absolute inset-0\"\n style={{ backgroundColor: overlayColor, opacity: overlayOpacity }}\n />\n\n {/* Content */}\n <div className=\"relative z-10 container mx-auto px-4 sm:px-6 py-16 text-center\">\n <h1\n className=\"text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold mb-4 leading-tight\"\n style={{ color: textColor }}\n >\n {heading}\n </h1>\n {subheading && (\n <p\n className=\"text-base sm:text-lg md:text-xl max-w-2xl mx-auto mb-8 opacity-90\"\n style={{ color: textColor }}\n >\n {subheading}\n </p>\n )}\n {buttonText && (\n <Link\n href={getStorePermalink(domain, buttonLink)}\n className=\"btn-primary inline-flex items-center px-6 py-3 sm:px-8 sm:py-3.5 text-sm sm:text-base font-semibold rounded-lg transition-opacity hover:opacity-90\"\n style={{ backgroundColor: 'var(--color-primary)', color: '#ffffff' }}\n >\n {buttonText}\n </Link>\n )}\n </div>\n </section>\n );\n}\n\nexport const schema = {\n type: 'hero',\n name: 'Hero Banner',\n limit: 1,\n settings: [],\n};\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport Link from 'next/link';\nimport { useTheme, getCollection, ProductCard, getStorePermalink } from '@zevcommerce/storefront-api';\nimport { useParams } from 'next/navigation';\n\nexport default function FeaturedProducts() {\n const { theme, storeConfig } = useTheme();\n const params = useParams();\n const domain = (params?.domain as string) || storeConfig?.handle || '';\n\n const products_settings = theme?.settings?.products;\n if (!products_settings?.enabled) return null;\n\n const heading = products_settings.heading || 'Featured Products';\n const collectionHandle = products_settings.collection || 'all';\n const limit = parseInt(products_settings.limit || '8');\n const columns = parseInt(products_settings.columns || '4');\n\n const [products, setProducts] = useState<any[]>([]);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n async function fetchData() {\n if (!domain || !collectionHandle) {\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const collection = await getCollection(domain, collectionHandle);\n if (collection) {\n const productList = collection.products?.map((p: any) => p.product || p) || [];\n setProducts(productList.slice(0, limit));\n }\n } catch (error: any) {\n if (error?.response?.status !== 404) {\n console.error('Error fetching products:', error);\n }\n } finally {\n setLoading(false);\n }\n }\n fetchData();\n }, [domain, collectionHandle, limit]);\n\n const gridColsMap: Record<number, string> = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-2 lg:grid-cols-3',\n 4: 'sm:grid-cols-2 lg:grid-cols-4',\n };\n const gridColsClass = gridColsMap[columns] || 'sm:grid-cols-2 lg:grid-cols-4';\n\n if (loading) {\n return (\n <section className=\"py-12 md:py-16\" style={{ backgroundColor: 'var(--color-background)' }}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"animate-pulse\">\n <div className=\"h-8 w-48 mb-8 rounded\" style={{ backgroundColor: '#e5e7eb' }} />\n <div className={`grid grid-cols-2 ${gridColsClass} gap-4 sm:gap-6`}>\n {[...Array(columns)].map((_, i) => (\n <div key={i} className=\"aspect-[3/4] rounded-lg\" style={{ backgroundColor: '#e5e7eb' }} />\n ))}\n </div>\n </div>\n </div>\n </section>\n );\n }\n\n if (products.length === 0) return null;\n\n return (\n <section className=\"py-12 md:py-16\" style={{ backgroundColor: 'var(--color-background)' }}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-8\">\n <h2\n className=\"text-2xl md:text-3xl font-bold\"\n style={{ color: 'var(--color-text)' }}\n >\n {heading}\n </h2>\n <Link\n href={getStorePermalink(domain, `/collections/${collectionHandle}`)}\n className=\"text-sm font-medium transition-opacity hover:opacity-70\"\n style={{ color: 'var(--color-primary)' }}\n >\n View All\n </Link>\n </div>\n\n {/* Grid */}\n <div className={`grid grid-cols-2 ${gridColsClass} gap-4 sm:gap-6`}>\n {products.map(product => (\n <ProductCard\n key={product.id}\n product={product}\n domain={domain}\n />\n ))}\n </div>\n </div>\n </section>\n );\n}\n\nexport const schema = {\n type: 'featured-products',\n name: 'Featured Products',\n limit: 1,\n settings: [],\n};\n","'use client';\n\nimport { useTheme } from '@zevcommerce/storefront-api';\n\nexport default function ContactInfo() {\n const { theme } = useTheme();\n const contact = theme?.settings?.contact;\n\n if (!contact?.enabled) return null;\n\n const heading = contact.heading || 'Get in Touch';\n const showPhone = contact.showPhone && contact.phone;\n const showEmail = contact.showEmail && contact.email;\n const showWhatsApp = contact.showWhatsApp && contact.whatsapp;\n const showAddress = contact.showAddress && contact.address;\n\n const hasItems = showPhone || showEmail || showWhatsApp || showAddress;\n if (!hasItems) return null;\n\n const cards: Array<{ icon: React.ReactNode; label: string; value: string; href?: string }> = [];\n\n if (showPhone) {\n cards.push({\n icon: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07 19.5 19.5 0 01-6-6 19.79 19.79 0 01-3.07-8.67A2 2 0 014.11 2h3a2 2 0 012 1.72c.127.96.361 1.903.7 2.81a2 2 0 01-.45 2.11L8.09 9.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0122 16.92z\" />\n </svg>\n ),\n label: 'Phone',\n value: contact.phone,\n href: `tel:${contact.phone}`,\n });\n }\n\n if (showEmail) {\n cards.push({\n icon: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\" />\n <polyline points=\"22,6 12,13 2,6\" />\n </svg>\n ),\n label: 'Email',\n value: contact.email,\n href: `mailto:${contact.email}`,\n });\n }\n\n if (showWhatsApp) {\n const waNumber = contact.whatsapp.replace(/[^0-9]/g, '');\n cards.push({\n icon: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\n </svg>\n ),\n label: 'WhatsApp',\n value: contact.whatsapp,\n href: `https://wa.me/${waNumber}`,\n });\n }\n\n if (showAddress) {\n cards.push({\n icon: (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n </svg>\n ),\n label: 'Address',\n value: contact.address,\n });\n }\n\n return (\n <section className=\"py-12 md:py-16\" style={{ backgroundColor: 'var(--color-background)' }}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <h2\n className=\"text-2xl md:text-3xl font-bold text-center mb-10\"\n style={{ color: 'var(--color-text)' }}\n >\n {heading}\n </h2>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 max-w-4xl mx-auto\">\n {cards.map((card, i) => {\n const content = (\n <div\n key={i}\n className=\"flex flex-col items-center text-center p-6 rounded-lg border transition-shadow hover:shadow-md\"\n style={{ borderColor: '#e5e7eb' }}\n >\n <div\n className=\"mb-3\"\n style={{ color: 'var(--color-primary)' }}\n >\n {card.icon}\n </div>\n <h3 className=\"text-xs font-semibold uppercase tracking-wider mb-1\" style={{ color: 'var(--color-text)', opacity: 0.5 }}>\n {card.label}\n </h3>\n <p className=\"text-sm font-medium\" style={{ color: 'var(--color-text)' }}>\n {card.value}\n </p>\n </div>\n );\n\n if (card.href) {\n return (\n <a key={i} href={card.href} target={card.label === 'WhatsApp' ? '_blank' : undefined} rel=\"noopener noreferrer\">\n {content}\n </a>\n );\n }\n return content;\n })}\n </div>\n </div>\n </section>\n );\n}\n\nexport const schema = {\n type: 'contact-info',\n name: 'Contact Info',\n limit: 1,\n settings: [],\n};\n","'use client';\n\nimport Link from 'next/link';\nimport { useTheme, resolveMenuUrl, getStorePermalink } from '@zevcommerce/storefront-api';\nimport { useParams } from 'next/navigation';\n\nexport default function Footer() {\n const { theme, storeConfig, menus } = useTheme();\n const params = useParams();\n const domain = (params?.domain as string) || storeConfig?.handle || '';\n\n const footer = theme?.settings?.footer;\n const storeName = storeConfig?.name || 'Store';\n const logoSrc = storeConfig?.storeLogo;\n\n const description = footer?.description || '';\n const menuHandle = footer?.menuHandle || 'footer';\n const copyright = footer?.copyright || `${new Date().getFullYear()} ${storeName}. All rights reserved.`;\n\n // Social links\n const socialLinks: Array<{ platform: string; url: string; icon: React.ReactNode }> = [];\n\n if (footer?.instagram) {\n socialLinks.push({\n platform: 'Instagram',\n url: footer.instagram,\n icon: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" ry=\"5\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <circle cx=\"17.5\" cy=\"6.5\" r=\"0.5\" fill=\"currentColor\" />\n </svg>\n ),\n });\n }\n\n if (footer?.facebook) {\n socialLinks.push({\n platform: 'Facebook',\n url: footer.facebook,\n icon: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18 2h-3a5 5 0 00-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 011-1h3z\" />\n </svg>\n ),\n });\n }\n\n if (footer?.twitter) {\n socialLinks.push({\n platform: 'Twitter',\n url: footer.twitter,\n icon: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n ),\n });\n }\n\n if (footer?.tiktok) {\n socialLinks.push({\n platform: 'TikTok',\n url: footer.tiktok,\n icon: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19.59 6.69a4.83 4.83 0 01-3.77-4.25V2h-3.45v13.67a2.89 2.89 0 01-2.88 2.5 2.89 2.89 0 01-2.89-2.89 2.89 2.89 0 012.89-2.89c.28 0 .54.04.79.1V9.01a6.33 6.33 0 00-.79-.05 6.34 6.34 0 00-6.34 6.34 6.34 6.34 0 006.34 6.34 6.34 6.34 0 006.33-6.34V9.04a8.28 8.28 0 004.84 1.55V7.14a4.85 4.85 0 01-1.07-.45z\" />\n </svg>\n ),\n });\n }\n\n // Footer menu\n const footerMenu = menus?.[menuHandle];\n const menuItems = (footerMenu as any)?.items || [];\n\n return (\n <footer\n className=\"py-12 md:py-16 border-t\"\n style={{ backgroundColor: 'var(--color-background)', borderColor: '#e5e7eb' }}\n >\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-10 md:gap-12\">\n {/* Brand column */}\n <div>\n <Link href={getStorePermalink(domain, '/')} className=\"inline-block mb-4\">\n {logoSrc ? (\n <img src={logoSrc} alt={storeName} className=\"h-8 w-auto object-contain\" />\n ) : (\n <span className=\"text-lg font-bold\" style={{ color: 'var(--color-text)' }}>{storeName}</span>\n )}\n </Link>\n {description && (\n <p className=\"text-sm leading-relaxed max-w-xs\" style={{ color: 'var(--color-text)', opacity: 0.6 }}>\n {description}\n </p>\n )}\n {/* Social icons */}\n {socialLinks.length > 0 && (\n <div className=\"flex items-center gap-4 mt-5\">\n {socialLinks.map((link, i) => (\n <a\n key={i}\n href={link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={link.platform}\n className=\"transition-opacity hover:opacity-70\"\n style={{ color: 'var(--color-text)', opacity: 0.5 }}\n >\n {link.icon}\n </a>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer menu */}\n {menuItems.length > 0 && (\n <div>\n <h3 className=\"text-sm font-semibold uppercase tracking-wider mb-4\" style={{ color: 'var(--color-text)' }}>\n Quick Links\n </h3>\n <nav className=\"flex flex-col gap-2.5\">\n {menuItems.map((item: any) => (\n <Link\n key={item.id}\n href={resolveMenuUrl(item, domain)}\n className=\"text-sm transition-opacity hover:opacity-70\"\n style={{ color: 'var(--color-text)', opacity: 0.6 }}\n >\n {item.title}\n </Link>\n ))}\n </nav>\n </div>\n )}\n\n {/* Store info */}\n <div>\n <h3 className=\"text-sm font-semibold uppercase tracking-wider mb-4\" style={{ color: 'var(--color-text)' }}>\n Store\n </h3>\n <div className=\"flex flex-col gap-2.5 text-sm\" style={{ color: 'var(--color-text)', opacity: 0.6 }}>\n {storeConfig?.email && <p>{storeConfig.email}</p>}\n {storeConfig?.phone && <p>{storeConfig.phone}</p>}\n </div>\n </div>\n </div>\n\n {/* Copyright */}\n <div className=\"mt-12 pt-8 border-t text-center\" style={{ borderColor: '#e5e7eb' }}>\n <p className=\"text-xs\" style={{ color: 'var(--color-text)', opacity: 0.4 }}>\n &copy; {copyright}\n </p>\n </div>\n </div>\n </footer>\n );\n}\n\nexport const schema = {\n type: 'footer',\n name: 'Footer',\n limit: 1,\n settings: [],\n};\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport Link from 'next/link';\nimport { useTheme, useProduct, useCartStore, getStorePermalink } from '@zevcommerce/storefront-api';\nimport { useParams } from 'next/navigation';\nimport { formatPrice } from '../helpers/format-price';\n\nexport default function ProductDetail() {\n const { theme, storeConfig } = useTheme();\n const { product, selectedVariant, quantity, setQuantity, setSelectedVariant } = useProduct();\n const { addItem, openCart } = useCartStore();\n const params = useParams();\n const domain = (params?.domain as string) || storeConfig?.handle || '';\n const currency = storeConfig?.currency || 'NGN';\n\n const [activeImageIndex, setActiveImageIndex] = useState(0);\n const [addedToCart, setAddedToCart] = useState(false);\n\n // Reset state when product changes\n useEffect(() => {\n setActiveImageIndex(0);\n setAddedToCart(false);\n }, [product?.id]);\n\n if (!product) {\n return (\n <div className=\"py-24 text-center\" style={{ backgroundColor: 'var(--color-background)' }}>\n <p className=\"text-sm\" style={{ color: 'var(--color-text)', opacity: 0.5 }}>\n Product not found\n </p>\n </div>\n );\n }\n\n const images = product.media || [];\n const variants = product.variants || [];\n const hasVariants = variants.length > 1;\n\n const currentVariant = selectedVariant || variants[0];\n const price = parseFloat(currentVariant?.price || product.price || '0');\n const compareAtPrice = parseFloat(currentVariant?.compareAtPrice || product.compareAtPrice || '0');\n const isOnSale = compareAtPrice > 0 && compareAtPrice > price;\n\n // Group variant options\n const optionGroups: Record<string, string[]> = {};\n variants.forEach((v: any) => {\n (v.options || []).forEach((opt: any) => {\n if (!optionGroups[opt.name]) optionGroups[opt.name] = [];\n if (!optionGroups[opt.name].includes(opt.value)) {\n optionGroups[opt.name].push(opt.value);\n }\n });\n });\n\n const handleAddToCart = () => {\n if (!currentVariant) return;\n addItem({\n variantId: currentVariant.id,\n productId: product.id,\n title: product.title,\n variantTitle: currentVariant.title || '',\n price: currentVariant.price,\n quantity,\n image: images[0]?.url || '',\n slug: product.slug,\n });\n setAddedToCart(true);\n openCart();\n setTimeout(() => setAddedToCart(false), 2000);\n };\n\n return (\n <section className=\"py-8 md:py-16\" style={{ backgroundColor: 'var(--color-background)' }}>\n <div className=\"container mx-auto px-4 sm:px-6 max-w-6xl\">\n {/* Breadcrumb */}\n <nav className=\"flex items-center gap-2 text-xs mb-8\" style={{ color: 'var(--color-text)', opacity: 0.5 }}>\n <Link href={getStorePermalink(domain, '/')} className=\"hover:opacity-70 transition-opacity\">Home</Link>\n <span>/</span>\n <Link href={getStorePermalink(domain, '/collections/all')} className=\"hover:opacity-70 transition-opacity\">Products</Link>\n <span>/</span>\n <span style={{ opacity: 1, color: 'var(--color-text)' }}>{product.title}</span>\n </nav>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-12\">\n {/* Image Gallery */}\n <div>\n {/* Main Image */}\n {images.length > 0 && (\n <div className=\"relative aspect-square mb-3 rounded-lg overflow-hidden\" style={{ backgroundColor: '#f3f4f6' }}>\n <img\n src={images[activeImageIndex]?.url}\n alt={product.title}\n className=\"w-full h-full object-cover\"\n />\n {isOnSale && (\n <span\n className=\"absolute top-3 left-3 text-xs font-semibold px-2.5 py-1 rounded\"\n style={{ backgroundColor: '#ef4444', color: '#fff' }}\n >\n Sale\n </span>\n )}\n </div>\n )}\n\n {/* Thumbnails */}\n {images.length > 1 && (\n <div className=\"flex gap-2 overflow-x-auto\">\n {images.map((img: any, i: number) => (\n <button\n key={i}\n onClick={() => setActiveImageIndex(i)}\n className=\"flex-shrink-0 w-16 h-16 rounded overflow-hidden border-2 transition-colors\"\n style={{\n borderColor: i === activeImageIndex ? 'var(--color-primary)' : 'transparent',\n }}\n >\n <img src={img.url} alt=\"\" className=\"w-full h-full object-cover\" />\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Product Info */}\n <div className=\"lg:sticky lg:top-24 lg:self-start\">\n {/* Vendor */}\n {product.vendor && (\n <p className=\"text-xs font-medium uppercase tracking-wider mb-2\" style={{ color: 'var(--color-primary)' }}>\n {product.vendor}\n </p>\n )}\n\n {/* Title */}\n <h1\n className=\"text-2xl md:text-3xl font-bold mb-3\"\n style={{ color: 'var(--color-text)' }}\n >\n {product.title}\n </h1>\n\n {/* Price */}\n <div className=\"flex items-center gap-3 mb-6\">\n <span className=\"text-xl font-bold\" style={{ color: 'var(--color-text)' }}>\n {formatPrice(price, currency)}\n </span>\n {isOnSale && (\n <span className=\"text-base line-through\" style={{ color: 'var(--color-text)', opacity: 0.4 }}>\n {formatPrice(compareAtPrice, currency)}\n </span>\n )}\n </div>\n\n {/* Variant Selectors */}\n {hasVariants && Object.entries(optionGroups).map(([optionName, values]) => {\n const currentValue = currentVariant?.options?.find((o: any) => o.name === optionName)?.value;\n return (\n <div key={optionName} className=\"mb-5\">\n <label className=\"block text-sm font-medium mb-2\" style={{ color: 'var(--color-text)' }}>\n {optionName}: <span className=\"font-normal\">{currentValue}</span>\n </label>\n <div className=\"flex flex-wrap gap-2\">\n {values.map((val) => {\n const isSelected = currentValue === val;\n return (\n <button\n key={val}\n onClick={() => {\n const match = variants.find((v: any) =>\n v.options?.some((o: any) => o.name === optionName && o.value === val)\n );\n if (match) setSelectedVariant(match);\n }}\n className=\"px-4 py-2 text-sm border rounded transition-colors\"\n style={{\n backgroundColor: isSelected ? 'var(--color-primary)' : 'transparent',\n color: isSelected ? '#fff' : 'var(--color-text)',\n borderColor: isSelected ? 'var(--color-primary)' : '#d1d5db',\n }}\n >\n {val}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n\n {/* Quantity */}\n <div className=\"mb-6\">\n <label className=\"block text-sm font-medium mb-2\" style={{ color: 'var(--color-text)' }}>\n Quantity\n </label>\n <div className=\"inline-flex items-center border rounded\" style={{ borderColor: '#d1d5db' }}>\n <button\n onClick={() => setQuantity(Math.max(1, quantity - 1))}\n className=\"px-3 py-2 text-sm hover:bg-gray-50 transition-colors\"\n style={{ color: 'var(--color-text)' }}\n >\n -\n </button>\n <span className=\"px-4 py-2 text-sm font-medium\" style={{ color: 'var(--color-text)' }}>\n {quantity}\n </span>\n <button\n onClick={() => setQuantity(quantity + 1)}\n className=\"px-3 py-2 text-sm hover:bg-gray-50 transition-colors\"\n style={{ color: 'var(--color-text)' }}\n >\n +\n </button>\n </div>\n </div>\n\n {/* Add to Cart */}\n <button\n onClick={handleAddToCart}\n className=\"w-full py-3.5 text-sm font-semibold rounded-lg transition-opacity hover:opacity-90\"\n style={{ backgroundColor: 'var(--color-primary)', color: '#fff' }}\n >\n {addedToCart ? 'Added!' : 'Add to Cart'}\n </button>\n\n {/* Description */}\n {product.description && (\n <div className=\"mt-8 pt-8 border-t\" style={{ borderColor: '#e5e7eb' }}>\n <h3 className=\"text-sm font-semibold mb-3\" style={{ color: 'var(--color-text)' }}>\n Description\n </h3>\n <div\n className=\"text-sm leading-relaxed prose prose-sm max-w-none\"\n style={{ color: 'var(--color-text)', opacity: 0.7 }}\n dangerouslySetInnerHTML={{ __html: product.description }}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n </section>\n );\n}\n\nexport const schema = {\n type: 'product-detail',\n name: 'Product Detail',\n settings: [],\n disabled_on: { templates: ['*'] },\n enabled_on: { templates: ['product_detail'] },\n};\n","/**\n * Currency-to-locale mapping for Intl.NumberFormat.\n */\nconst CURRENCY_LOCALES: Record<string, string> = {\n USD: 'en-US',\n EUR: 'de-DE',\n GBP: 'en-GB',\n NGN: 'en-NG',\n GHS: 'en-GH',\n KES: 'en-KE',\n ZAR: 'en-ZA',\n CAD: 'en-CA',\n AUD: 'en-AU',\n JPY: 'ja-JP',\n INR: 'en-IN',\n BRL: 'pt-BR',\n MXN: 'es-MX',\n AED: 'ar-AE',\n SAR: 'ar-SA',\n XOF: 'fr-SN',\n XAF: 'fr-CM',\n TZS: 'en-TZ',\n UGX: 'en-UG',\n RWF: 'en-RW',\n};\n\n/**\n * Formats a numeric price into a localised currency string.\n *\n * @param amount The price as a number or numeric string.\n * @param currency ISO 4217 currency code (e.g. \"NGN\").\n * @returns Formatted string, e.g. \"NGN 1,500.00\".\n */\nexport function formatPrice(amount: number | string, currency = 'NGN'): string {\n const value = typeof amount === 'string' ? parseFloat(amount) : amount;\n if (isNaN(value)) return `${currency} 0.00`;\n\n const locale = CURRENCY_LOCALES[currency] || 'en-US';\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n } catch {\n return `${currency} ${value.toFixed(2)}`;\n }\n}\n","'use client';\n\nimport { useTheme, useCollection, ProductCard } from '@zevcommerce/storefront-api';\nimport { useParams } from 'next/navigation';\n\nexport default function ProductList() {\n const { storeConfig } = useTheme();\n const { collection } = useCollection();\n const params = useParams();\n const domain = (params?.domain as string) || storeConfig?.handle || '';\n\n if (!collection) {\n return (\n <div className=\"py-24 text-center\" style={{ backgroundColor: 'var(--color-background)' }}>\n <div className=\"animate-pulse flex flex-col items-center\">\n <div className=\"h-8 w-48 rounded mb-4\" style={{ backgroundColor: '#e5e7eb' }} />\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4 w-full max-w-6xl mx-auto px-4\">\n {[1, 2, 3, 4].map(i => (\n <div key={i} className=\"aspect-[3/4] rounded-lg\" style={{ backgroundColor: '#e5e7eb' }} />\n ))}\n </div>\n </div>\n </div>\n );\n }\n\n const products = collection.products?.map((p: any) => p.product || p) || [];\n\n return (\n <section className=\"py-8 md:py-16\" style={{ backgroundColor: 'var(--color-background)' }}>\n <div className=\"container mx-auto px-4 sm:px-6 max-w-6xl\">\n {/* Collection Header */}\n <div className=\"mb-8 md:mb-10\">\n <h1\n className=\"text-2xl md:text-3xl font-bold mb-2\"\n style={{ color: 'var(--color-text)' }}\n >\n {collection.title}\n </h1>\n {collection.description && (\n <p className=\"text-sm max-w-2xl\" style={{ color: 'var(--color-text)', opacity: 0.6 }}>\n {collection.description}\n </p>\n )}\n </div>\n\n {/* Product Grid */}\n {products.length > 0 ? (\n <div className=\"grid grid-cols-2 sm:grid-cols-2 lg:grid-cols-4 gap-4 sm:gap-6\">\n {products.map((product: any) => (\n <ProductCard\n key={product.id}\n product={product}\n domain={domain}\n />\n ))}\n </div>\n ) : (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm\" style={{ color: 'var(--color-text)', opacity: 0.5 }}>\n No products found in this collection.\n </p>\n </div>\n )}\n </div>\n </section>\n );\n}\n\nexport const schema = {\n type: 'product-list',\n name: 'Product List',\n settings: [],\n disabled_on: { templates: ['*'] },\n enabled_on: { templates: ['collection'] },\n};\n","'use client';\n\nimport Link from 'next/link';\nimport { useTheme, useCartStore, getStorePermalink } from '@zevcommerce/storefront-api';\nimport { useParams } from 'next/navigation';\nimport { formatPrice } from '../helpers/format-price';\n\nexport default function CartSection() {\n const { storeConfig } = useTheme();\n const { items, totalPrice, removeItem, updateQuantity } = useCartStore();\n const params = useParams();\n const domain = (params?.domain as string) || storeConfig?.handle || '';\n const currency = storeConfig?.currency || 'NGN';\n\n const total = typeof totalPrice === 'function' ? totalPrice() : totalPrice;\n\n if (items.length === 0) {\n return (\n <div className=\"py-24 text-center\" style={{ backgroundColor: 'var(--color-background)' }}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div\n className=\"w-16 h-16 mx-auto mb-6 rounded-full flex items-center justify-center\"\n style={{ backgroundColor: '#f3f4f6' }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" style={{ color: 'var(--color-text)', opacity: 0.4 }}>\n <path d=\"M6 2L3 6v14a2 2 0 002 2h14a2 2 0 002-2V6l-3-4z\" />\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <path d=\"M16 10a4 4 0 01-8 0\" />\n </svg>\n </div>\n <h1 className=\"text-xl font-bold mb-2\" style={{ color: 'var(--color-text)' }}>\n Your cart is empty\n </h1>\n <p className=\"text-sm mb-6\" style={{ color: 'var(--color-text)', opacity: 0.5 }}>\n Start browsing to add items to your cart.\n </p>\n <Link\n href={getStorePermalink(domain, '/collections/all')}\n className=\"btn-primary\"\n >\n Browse Products\n </Link>\n </div>\n </div>\n );\n }\n\n return (\n <section className=\"py-8 md:py-16\" style={{ backgroundColor: 'var(--color-background)' }}>\n <div className=\"container mx-auto px-4 sm:px-6 max-w-4xl\">\n <h1 className=\"text-2xl md:text-3xl font-bold mb-8\" style={{ color: 'var(--color-text)' }}>\n Your Cart\n <span className=\"text-base font-normal ml-2\" style={{ opacity: 0.5 }}>\n ({items.length} {items.length === 1 ? 'item' : 'items'})\n </span>\n </h1>\n\n {/* Cart Items */}\n <div className=\"divide-y\" style={{ borderColor: '#e5e7eb' }}>\n {items.map((item) => (\n <div key={item.variantId} className=\"flex gap-4 py-6\">\n {/* Image */}\n {item.image && (\n <Link\n href={getStorePermalink(domain, `/products/${item.slug}`)}\n className=\"flex-shrink-0\"\n >\n <img\n src={item.image}\n alt={item.title}\n className=\"w-20 h-20 sm:w-24 sm:h-24 object-cover rounded-lg\"\n />\n </Link>\n )}\n\n {/* Details */}\n <div className=\"flex-1 min-w-0\">\n <Link\n href={getStorePermalink(domain, `/products/${item.slug}`)}\n className=\"text-sm font-medium hover:opacity-70 transition-opacity\"\n style={{ color: 'var(--color-text)' }}\n >\n {item.title}\n </Link>\n {item.variantTitle && (\n <p className=\"text-xs mt-1\" style={{ color: 'var(--color-text)', opacity: 0.5 }}>\n {item.variantTitle}\n </p>\n )}\n <p className=\"text-sm font-semibold mt-2\" style={{ color: 'var(--color-text)' }}>\n {formatPrice(parseFloat(item.price) * item.quantity, currency)}\n </p>\n\n {/* Quantity controls */}\n <div className=\"flex items-center gap-3 mt-3\">\n <div className=\"inline-flex items-center border rounded text-sm\" style={{ borderColor: '#d1d5db' }}>\n <button\n onClick={() => updateQuantity(item.variantId, -1)}\n className=\"px-2.5 py-1 hover:bg-gray-50 transition-colors\"\n style={{ color: 'var(--color-text)' }}\n >\n -\n </button>\n <span className=\"px-3 py-1\" style={{ color: 'var(--color-text)' }}>\n {item.quantity}\n </span>\n <button\n onClick={() => updateQuantity(item.variantId, 1)}\n className=\"px-2.5 py-1 hover:bg-gray-50 transition-colors\"\n style={{ color: 'var(--color-text)' }}\n >\n +\n </button>\n </div>\n <button\n onClick={() => removeItem(item.variantId)}\n className=\"text-xs font-medium transition-opacity hover:opacity-70\"\n style={{ color: '#ef4444' }}\n >\n Remove\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n\n {/* Summary */}\n <div className=\"mt-8 pt-6 border-t\" style={{ borderColor: '#e5e7eb' }}>\n <div className=\"flex items-center justify-between mb-6\">\n <span className=\"text-base font-semibold\" style={{ color: 'var(--color-text)' }}>\n Total\n </span>\n <span className=\"text-lg font-bold\" style={{ color: 'var(--color-text)' }}>\n {formatPrice(total, currency)}\n </span>\n </div>\n <Link\n href={getStorePermalink(domain, '/checkout')}\n className=\"btn-primary w-full text-center block py-3.5\"\n >\n Proceed to Checkout\n </Link>\n </div>\n </div>\n </section>\n );\n}\n\nexport const schema = {\n type: 'cart-page',\n name: 'Cart Page',\n settings: [],\n disabled_on: { templates: ['*'] },\n enabled_on: { templates: ['cart'] },\n};\n","'use client';\n\nimport { CheckoutForm } from '@zevcommerce/storefront-api';\n\nexport default function CheckoutSection() {\n return (\n <div className=\"min-h-screen\" style={{ backgroundColor: 'var(--color-background)' }}>\n <div className=\"container mx-auto px-4 sm:px-6 py-8 md:py-16 max-w-4xl\">\n <CheckoutForm />\n </div>\n </div>\n );\n}\n\nexport const schema = {\n type: 'checkout-page',\n name: 'Checkout Page',\n settings: [],\n disabled_on: { templates: ['*'] },\n enabled_on: { templates: ['checkout'] },\n};\n","import Header from './sections/Header';\nimport { schema as HeaderSchema } from './sections/Header';\nimport Announcement from './sections/Announcement';\nimport { schema as AnnouncementSchema } from './sections/Announcement';\nimport Hero from './sections/Hero';\nimport { schema as HeroSchema } from './sections/Hero';\nimport FeaturedProducts from './sections/FeaturedProducts';\nimport { schema as FeaturedProductsSchema } from './sections/FeaturedProducts';\nimport ContactInfo from './sections/ContactInfo';\nimport { schema as ContactInfoSchema } from './sections/ContactInfo';\nimport Footer from './sections/Footer';\nimport { schema as FooterSchema } from './sections/Footer';\nimport ProductDetail from './sections/ProductDetail';\nimport { schema as ProductDetailSchema } from './sections/ProductDetail';\nimport ProductList from './sections/ProductList';\nimport { schema as ProductListSchema } from './sections/ProductList';\nimport CartSection from './sections/CartSection';\nimport { schema as CartSectionSchema } from './sections/CartSection';\nimport CheckoutSection from './sections/CheckoutSection';\nimport { schema as CheckoutSectionSchema } from './sections/CheckoutSection';\n\nexport const starterSectionRegistry: Record<string, { component: any; schema: any }> = {\n 'header': { component: Header as any, schema: HeaderSchema },\n 'announcement': { component: Announcement as any, schema: AnnouncementSchema },\n 'hero': { component: Hero as any, schema: HeroSchema },\n 'featured-products': { component: FeaturedProducts as any, schema: FeaturedProductsSchema },\n 'contact-info': { component: ContactInfo as any, schema: ContactInfoSchema },\n 'footer': { component: Footer as any, schema: FooterSchema },\n 'product-detail': { component: ProductDetail as any, schema: ProductDetailSchema },\n 'product-list': { component: ProductList as any, schema: ProductListSchema },\n 'cart-page': { component: CartSection as any, schema: CartSectionSchema },\n 'checkout-page': { component: CheckoutSection as any, schema: CheckoutSectionSchema },\n};\n\nexport const starterBlockRegistry: Record<string, { component: any; schema: any }> = {};\n","{\n \"name\": \"Starter\",\n \"settings\": {\n \"brand\": {\n \"primary\": \"#2563EB\",\n \"background\": \"#ffffff\",\n \"text\": \"#374151\",\n \"accent\": \"#F59E0B\",\n \"font\": \"Inter\"\n },\n \"header\": {\n \"logo\": null,\n \"logoHeight\": 36,\n \"sticky\": true,\n \"showSearch\": true,\n \"menuHandle\": \"main-menu\"\n },\n \"hero\": {\n \"enabled\": true,\n \"backgroundImage\": null,\n \"heading\": \"Welcome to our store\",\n \"subheading\": \"Discover amazing products at great prices.\",\n \"buttonText\": \"Shop Now\",\n \"buttonLink\": \"/collections/all\",\n \"overlayOpacity\": 50,\n \"overlayColor\": \"#000000\",\n \"textColor\": \"#ffffff\"\n },\n \"products\": {\n \"enabled\": true,\n \"heading\": \"Featured Products\",\n \"collection\": \"all\",\n \"limit\": 8,\n \"columns\": \"4\"\n },\n \"contact\": {\n \"enabled\": false,\n \"heading\": \"Get in Touch\",\n \"showPhone\": true,\n \"phone\": \"\",\n \"showEmail\": true,\n \"email\": \"\",\n \"showWhatsApp\": false,\n \"whatsapp\": \"\",\n \"showAddress\": false,\n \"address\": \"\"\n },\n \"footer\": {\n \"description\": \"\",\n \"menuHandle\": \"footer\",\n \"copyright\": \"\",\n \"instagram\": \"\",\n \"facebook\": \"\",\n \"twitter\": \"\",\n \"tiktok\": \"\"\n },\n \"announcement\": {\n \"enabled\": false,\n \"text\": \"Free shipping on orders over $50!\",\n \"backgroundColor\": \"#2563EB\",\n \"textColor\": \"#ffffff\"\n }\n },\n \"sections\": {\n \"announcement_1\": {\n \"type\": \"announcement\",\n \"settings\": {}\n },\n \"header_1\": {\n \"type\": \"header\",\n \"settings\": {}\n },\n \"hero_1\": {\n \"type\": \"hero\",\n \"settings\": {}\n },\n \"featured_products_1\": {\n \"type\": \"featured-products\",\n \"settings\": {}\n },\n \"contact_info_1\": {\n \"type\": \"contact-info\",\n \"settings\": {}\n },\n \"footer_1\": {\n \"type\": \"footer\",\n \"settings\": {}\n },\n \"main-product\": {\n \"type\": \"product-detail\",\n \"settings\": {}\n },\n \"main-collection\": {\n \"type\": \"product-list\",\n \"settings\": {}\n },\n \"main-cart\": {\n \"type\": \"cart-page\",\n \"settings\": {}\n },\n \"main-checkout\": {\n \"type\": \"checkout-page\",\n \"settings\": {}\n }\n },\n \"layout\": {\n \"header\": [\n \"announcement_1\",\n \"header_1\"\n ],\n \"content\": [\n \"hero_1\",\n \"featured_products_1\",\n \"contact_info_1\"\n ],\n \"footer\": [\n \"footer_1\"\n ]\n },\n \"templates\": {\n \"product_detail\": { \"order\": [\"main-product\"] },\n \"collection\": { \"order\": [\"main-collection\"] },\n \"cart\": { \"order\": [\"main-cart\"] },\n \"checkout\": { \"order\": [\"main-checkout\"] }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,oBAA4B;;;ACA5B,uBAA+B;AAExB,IAAM,qBAAiB,iCAAe;AAAA;AAAA;AAAA;AAAA,EAI3C;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR,EAAE,MAAM,SAAS,IAAI,iBAAiB,OAAO,iBAAiB,SAAS,UAAU;AAAA,MACjF,EAAE,MAAM,SAAS,IAAI,oBAAoB,OAAO,oBAAoB,SAAS,UAAU;AAAA,MACvF,EAAE,MAAM,SAAS,IAAI,cAAc,OAAO,cAAc,SAAS,UAAU;AAAA,MAC3E,EAAE,MAAM,SAAS,IAAI,gBAAgB,OAAO,gBAAgB,SAAS,UAAU;AAAA,MAC/E;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,UACjC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,UACnC,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,UACzC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,UACrC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR,EAAE,MAAM,SAAS,IAAI,eAAe,OAAO,aAAa;AAAA,MACxD,EAAE,MAAM,SAAS,IAAI,qBAAqB,OAAO,oBAAoB,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,GAAG;AAAA,MAC5G,EAAE,MAAM,YAAY,IAAI,iBAAiB,OAAO,iBAAiB,SAAS,KAAK;AAAA,MAC/E,EAAE,MAAM,YAAY,IAAI,qBAAqB,OAAO,oBAAoB,SAAS,KAAK;AAAA,MACtF,EAAE,MAAM,QAAQ,IAAI,qBAAqB,OAAO,eAAe,SAAS,YAAY;AAAA,IACtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR,EAAE,MAAM,YAAY,IAAI,gBAAgB,OAAO,aAAa,SAAS,KAAK;AAAA,MAC1E,EAAE,MAAM,SAAS,IAAI,wBAAwB,OAAO,mBAAmB;AAAA,MACvE,EAAE,MAAM,QAAQ,IAAI,gBAAgB,OAAO,WAAW,SAAS,uBAAuB;AAAA,MACtF,EAAE,MAAM,YAAY,IAAI,mBAAmB,OAAO,cAAc,SAAS,6CAA6C;AAAA,MACtH,EAAE,MAAM,QAAQ,IAAI,mBAAmB,OAAO,eAAe,SAAS,WAAW;AAAA,MACjF,EAAE,MAAM,QAAQ,IAAI,mBAAmB,OAAO,eAAe,SAAS,mBAAmB;AAAA,MACzF,EAAE,MAAM,SAAS,IAAI,uBAAuB,OAAO,mBAAmB,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,SAAS,GAAG;AAAA,MAC7G,EAAE,MAAM,SAAS,IAAI,qBAAqB,OAAO,iBAAiB,SAAS,UAAU;AAAA,MACrF,EAAE,MAAM,SAAS,IAAI,kBAAkB,OAAO,cAAc,SAAS,UAAU;AAAA,IACjF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR,EAAE,MAAM,YAAY,IAAI,oBAAoB,OAAO,0BAA0B,SAAS,KAAK;AAAA,MAC3F,EAAE,MAAM,QAAQ,IAAI,oBAAoB,OAAO,mBAAmB,SAAS,oBAAoB;AAAA,MAC/F,EAAE,MAAM,qBAAqB,IAAI,uBAAuB,OAAO,cAAc,SAAS,MAAM;AAAA,MAC5F,EAAE,MAAM,SAAS,IAAI,kBAAkB,OAAO,sBAAsB,KAAK,GAAG,KAAK,IAAI,MAAM,GAAG,SAAS,EAAE;AAAA,MACzG;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,OAAO,KAAK,OAAO,YAAY;AAAA,UACjC,EAAE,OAAO,KAAK,OAAO,YAAY;AAAA,UACjC,EAAE,OAAO,KAAK,OAAO,YAAY;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR,EAAE,MAAM,YAAY,IAAI,mBAAmB,OAAO,wBAAwB,SAAS,MAAM;AAAA,MACzF,EAAE,MAAM,QAAQ,IAAI,mBAAmB,OAAO,mBAAmB,SAAS,eAAe;AAAA,MACzF,EAAE,MAAM,YAAY,IAAI,qBAAqB,OAAO,cAAc,SAAS,KAAK;AAAA,MAChF,EAAE,MAAM,QAAQ,IAAI,iBAAiB,OAAO,gBAAgB,SAAS,GAAG;AAAA,MACxE,EAAE,MAAM,YAAY,IAAI,qBAAqB,OAAO,cAAc,SAAS,KAAK;AAAA,MAChF,EAAE,MAAM,QAAQ,IAAI,iBAAiB,OAAO,iBAAiB,SAAS,GAAG;AAAA,MACzE,EAAE,MAAM,YAAY,IAAI,wBAAwB,OAAO,iBAAiB,SAAS,MAAM;AAAA,MACvF,EAAE,MAAM,QAAQ,IAAI,oBAAoB,OAAO,mBAAmB,SAAS,GAAG;AAAA,MAC9E,EAAE,MAAM,YAAY,IAAI,uBAAuB,OAAO,gBAAgB,SAAS,MAAM;AAAA,MACrF,EAAE,MAAM,YAAY,IAAI,mBAAmB,OAAO,WAAW,SAAS,GAAG;AAAA,IAC3E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR,EAAE,MAAM,YAAY,IAAI,sBAAsB,OAAO,qBAAqB,SAAS,GAAG;AAAA,MACtF,EAAE,MAAM,QAAQ,IAAI,qBAAqB,OAAO,sBAAsB,SAAS,SAAS;AAAA,MACxF,EAAE,MAAM,QAAQ,IAAI,oBAAoB,OAAO,kBAAkB,SAAS,GAAG;AAAA,MAC7E,EAAE,MAAM,QAAQ,IAAI,oBAAoB,OAAO,iBAAiB,SAAS,GAAG;AAAA,MAC5E,EAAE,MAAM,QAAQ,IAAI,mBAAmB,OAAO,gBAAgB,SAAS,GAAG;AAAA,MAC1E,EAAE,MAAM,QAAQ,IAAI,kBAAkB,OAAO,mBAAmB,SAAS,GAAG;AAAA,MAC5E,EAAE,MAAM,QAAQ,IAAI,iBAAiB,OAAO,cAAc,SAAS,GAAG;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,MACR,EAAE,MAAM,YAAY,IAAI,wBAAwB,OAAO,yBAAyB,SAAS,MAAM;AAAA,MAC/F,EAAE,MAAM,QAAQ,IAAI,qBAAqB,OAAO,qBAAqB,SAAS,oCAAoC;AAAA,MAClH,EAAE,MAAM,SAAS,IAAI,gCAAgC,OAAO,oBAAoB,SAAS,UAAU;AAAA,MACnG,EAAE,MAAM,SAAS,IAAI,0BAA0B,OAAO,cAAc,SAAS,UAAU;AAAA,IACzF;AAAA,EACF;AACF,CAAC;;;ACzID,mBAA4C;AAC5C,kBAAiB;AACjB,4BAAuF;AACvF,wBAAqC;AAmFjC;AAjFW,SAAR,SAA0B;AAC/B,QAAM,EAAE,OAAAC,QAAO,aAAa,MAAM,QAAI,gCAAS;AAC/C,QAAM,EAAE,UAAU,MAAM,QAAI,oCAAa;AACzC,QAAM,aAAS,6BAAU;AACzB,QAAM,aAAS,6BAAU;AAEzB,QAAM,SAASA,QAAO,UAAU;AAChC,QAAM,UAAU,QAAQ,QAAQ,aAAa;AAC7C,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,SAAS,QAAQ,WAAW;AAClC,QAAM,aAAa,QAAQ,eAAe;AAC1C,QAAM,aAAa,QAAQ,cAAc;AAEzC,QAAM,SAAU,QAAQ,UAAqB,aAAa,UAAU;AACpE,QAAM,YAAY,aAAa,QAAQ;AAGvC,QAAM,iBAAiB,OAAO,OAAO,SAAS,CAAC,CAAC;AAChD,QAAM,cAAc,eAAe,KAAK,CAAC,MAAW,EAAE,SAAS;AAC/D,QAAM,aAAc,cAAc,QAAQ,UAAU,KAAM,eAAe,eAAe,CAAC;AACzF,QAAM,YAAa,YAAoB,SAAS,CAAC;AAGjD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,EAAE;AACjD,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAgB,CAAC,CAAC;AACxD,QAAM,gBAAY,qBAAyB,IAAI;AAE/C,QAAM,YAAY,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,UAAU,CAAC;AAGpE,8BAAU,MAAM;AACd,aAAS,KAAK,MAAM,WAAY,cAAc,aAAc,WAAW;AACvE,WAAO,MAAM;AAAE,eAAS,KAAK,MAAM,WAAW;AAAA,IAAI;AAAA,EACpD,GAAG,CAAC,YAAY,UAAU,CAAC;AAG3B,8BAAU,MAAM;AACd,QAAI,WAAY,WAAU,SAAS,MAAM;AAAA,EAC3C,GAAG,CAAC,UAAU,CAAC;AAGf,8BAAU,MAAM;AACd,UAAM,UAAU,CAAC,MAAqB;AACpC,UAAI,EAAE,QAAQ,UAAU;AACtB,sBAAc,KAAK;AACnB,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,EAC5D,GAAG,CAAC,CAAC;AAGL,8BAAU,MAAM;AACd,UAAM,QAAQ,WAAW,YAAY;AACnC,UAAI,YAAY,SAAS,GAAG;AAC1B,YAAI;AACF,gBAAM,EAAE,KAAK,IAAI,UAAM,mCAAY,QAAQ,GAAG,GAAG,WAAW;AAC5D,yBAAe,IAAI;AAAA,QACrB,QAAQ;AACN,yBAAe,CAAC,CAAC;AAAA,QACnB;AAAA,MACF,OAAO;AACL,uBAAe,CAAC,CAAC;AAAA,MACnB;AAAA,IACF,GAAG,GAAG;AACN,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,eAAe,CAAC,MAAuB;AAC3C,MAAE,eAAe;AACjB,QAAI,CAAC,YAAY,KAAK,EAAG;AACzB,WAAO,SAAK,yCAAkB,QAAQ,aAAa,mBAAmB,WAAW,CAAC,EAAE,CAAC;AACrF,kBAAc,KAAK;AACnB,mBAAe,EAAE;AACjB,mBAAe,CAAC,CAAC;AAAA,EACnB;AAEA,SACE,4EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,UAAU,SAAS,WAAW;AAAA,UAC9B,KAAK;AAAA,UACL,QAAQ;AAAA,QACV;AAAA,QAEA,sDAAC,SAAI,WAAU,kCACb,uDAAC,SAAI,WAAU,0CAEb;AAAA,sDAAC,YAAAC,SAAA,EAAK,UAAM,yCAAkB,QAAQ,GAAG,GAAG,WAAU,iBACnD,oBACC;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,EAAE,QAAQ,GAAG,UAAU,MAAM,OAAO,QAAQ,WAAW,UAAU;AAAA;AAAA,UAC1E,IAEA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,cAEnC;AAAA;AAAA,UACH,GAEJ;AAAA,UAGA,4CAAC,SAAI,WAAU,qCACZ,oBAAU,IAAI,CAAC,SACd;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cAEC,UAAM,sCAAe,MAAM,MAAM;AAAA,cACjC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,cAEnC,eAAK;AAAA;AAAA,YALD,KAAK;AAAA,UAMZ,CACD,GACH;AAAA,UAGA,6CAAC,SAAI,WAAU,2BAEZ;AAAA,0BACC;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,cAAc,IAAI;AAAA,gBACjC,cAAW;AAAA,gBACX,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,gBAEpC,uDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACrI;AAAA,8DAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,kBAC9B,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,SAAQ;AAAA,mBAC9C;AAAA;AAAA,YACF;AAAA,YAIF;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,cAAW;AAAA,gBACX,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,gBAEpC;AAAA,+DAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACrI;AAAA,gEAAC,UAAK,GAAE,kDAAiD;AAAA,oBACzD,4CAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI;AAAA,oBACnC,4CAAC,UAAK,GAAE,uBAAsB;AAAA,qBAChC;AAAA,kBACC,YAAY,KACX;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,iBAAiB,wBAAwB,OAAO,OAAO;AAAA,sBAE/D;AAAA;AAAA,kBACH;AAAA;AAAA;AAAA,YAEJ;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,cAAc,IAAI;AAAA,gBACjC,cAAW;AAAA,gBACX,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,gBAEpC,uDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACrI;AAAA,8DAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI;AAAA,kBACnC,4CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,kBACrC,4CAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,mBACvC;AAAA;AAAA,YACF;AAAA,aACF;AAAA,WACF,GACF;AAAA;AAAA,IACF;AAAA,IAGC,cACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,iBAAiB,kBAAkB;AAAA,QAC5C,SAAS,CAAC,MAAM;AAAE,cAAI,EAAE,WAAW,EAAE,eAAe;AAAE,0BAAc,KAAK;AAAG,2BAAe,CAAC,CAAC;AAAA,UAAG;AAAA,QAAE;AAAA,QAElG,uDAAC,SAAI,WAAU,mDAAkD,OAAO,EAAE,iBAAiB,0BAA0B,GACnH;AAAA,uDAAC,UAAK,UAAU,cAAc,WAAU,wCAAuC,OAAO,EAAE,aAAa,UAAU,GAC7G;AAAA,yDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,WAAU,sBAAqB,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GACjL;AAAA,0DAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,cAC9B,4CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,SAAQ;AAAA,eAC9C;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,gBAC9C,aAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,oBAAoB;AAAA;AAAA,YACtC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AAAE,gCAAc,KAAK;AAAG,iCAAe,CAAC,CAAC;AAAG,iCAAe,EAAE;AAAA,gBAAG;AAAA,gBAC/E,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI;AAAA,gBAElD,uDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAC9G;AAAA,8DAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,kBACpC,4CAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA,mBACtC;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UACC,YAAY,SAAS,KACpB,4CAAC,SAAI,WAAU,4BACZ,sBAAY,IAAI,CAAC,YAChB;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cAEC,UAAM,yCAAkB,QAAQ,aAAa,QAAQ,IAAI,EAAE;AAAA,cAC3D,SAAS,MAAM;AAAE,8BAAc,KAAK;AAAG,+BAAe,CAAC,CAAC;AAAG,+BAAe,EAAE;AAAA,cAAG;AAAA,cAC/E,WAAU;AAAA,cAET;AAAA,wBAAQ,QAAQ,CAAC,GAAG,OACnB,4CAAC,SAAI,KAAK,QAAQ,MAAM,CAAC,EAAE,KAAK,KAAK,QAAQ,OAAO,WAAU,kCAAiC;AAAA,gBAEjG,4CAAC,SAAI,WAAU,kBACb,sDAAC,OAAE,WAAU,gCAA+B,OAAO,EAAE,OAAO,oBAAoB,GAAI,kBAAQ,OAAM,GACpG;AAAA;AAAA;AAAA,YAVK,QAAQ;AAAA,UAWf,CACD,GACH;AAAA,WAEJ;AAAA;AAAA,IACF;AAAA,IAID,cACC,6CAAC,SAAI,WAAU,mCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,iBAAiB,kBAAkB;AAAA,UAC5C,SAAS,MAAM,cAAc,KAAK;AAAA;AAAA,MACpC;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,iBAAiB,0BAA0B;AAAA,UAGpD;AAAA,yDAAC,SAAI,WAAU,wDAAuD,OAAO,EAAE,aAAa,UAAU,GACpG;AAAA,0DAAC,YAAAA,SAAA,EAAK,UAAM,yCAAkB,QAAQ,GAAG,GAAG,SAAS,MAAM,cAAc,KAAK,GAC3E,oBACC,4CAAC,SAAI,KAAK,SAAS,KAAK,WAAW,OAAO,EAAE,QAAQ,QAAQ,OAAO,OAAO,GAAG,IAE7E,4CAAC,UAAK,WAAU,qBAAoB,OAAO,EAAE,OAAO,oBAAoB,GAAI,qBAAU,GAE1F;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM,cAAc,KAAK;AAAA,kBAClC,cAAW;AAAA,kBACX,WAAU;AAAA,kBACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,kBAEpC,uDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAC9G;AAAA,gEAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,oBACpC,4CAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA,qBACtC;AAAA;AAAA,cACF;AAAA,eACF;AAAA,YAGA,4CAAC,SAAI,WAAU,oCACZ,oBAAU,IAAI,CAAC,SACd;AAAA,cAAC,YAAAA;AAAA,cAAA;AAAA,gBAEC,UAAM,sCAAe,MAAM,MAAM;AAAA,gBACjC,SAAS,MAAM,cAAc,KAAK;AAAA,gBAClC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,qBAAqB,aAAa,UAAU;AAAA,gBAE3D,eAAK;AAAA;AAAA,cAND,KAAK;AAAA,YAOZ,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEO,IAAM,SAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU,CAAC;AACb;;;AChTA,IAAAC,yBAAyB;AAiBnB,IAAAC,sBAAA;AAfS,SAAR,eAAgC;AACrC,QAAM,EAAE,OAAAC,OAAM,QAAI,iCAAS;AAC3B,QAAM,eAAeA,QAAO,UAAU;AAEtC,MAAI,CAAC,cAAc,QAAS,QAAO;AAEnC,QAAM,OAAO,aAAa,QAAQ;AAClC,QAAM,kBAAkB,aAAa,mBAAmB;AACxD,QAAM,YAAY,aAAa,aAAa;AAE5C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,iBAAiB,OAAO,WAAW,YAAY,mBAAmB;AAAA,MAE3E,uDAAC,OAAE,WAAU,uCAAuC,gBAAK;AAAA;AAAA,EAC3D;AAEJ;AAEO,IAAMC,UAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU,CAAC;AACb;;;AC3BA,IAAAC,eAAiB;AACjB,IAAAC,yBAA4C;AAC5C,IAAAC,qBAA0B;AAsCpB,IAAAC,sBAAA;AApCS,SAAR,OAAwB;AAC7B,QAAM,EAAE,OAAAC,QAAO,YAAY,QAAI,iCAAS;AACxC,QAAM,aAAS,8BAAU;AACzB,QAAM,SAAU,QAAQ,UAAqB,aAAa,UAAU;AAEpE,QAAM,OAAOA,QAAO,UAAU;AAC9B,MAAI,CAAC,MAAM,QAAS,QAAO;AAE3B,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,aAAa,KAAK,cAAc;AACtC,QAAM,kBAAkB,KAAK,kBAAkB,MAAM;AACrD,QAAM,eAAe,KAAK,gBAAgB;AAC1C,QAAM,YAAY,KAAK,aAAa;AAEpC,QAAM,eAAe,CAAC,QAAa;AACjC,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAI,OAAO,QAAQ,YAAY,IAAI,IAAK,QAAO,IAAI;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,aAAa,KAAK,eAAe;AAEjD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,iBAAiB,UAAU,QAAQ,OAAO,OAAO;AAAA,QACjD,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,iBAAiB,CAAC,UAAU,YAAY;AAAA,MAC1C;AAAA,MAGA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,cAAc,SAAS,eAAe;AAAA;AAAA,QAClE;AAAA,QAGA,8CAAC,SAAI,WAAU,kEACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,UAAU;AAAA,cAEzB;AAAA;AAAA,UACH;AAAA,UACC,cACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,UAAU;AAAA,cAEzB;AAAA;AAAA,UACH;AAAA,UAED,cACC;AAAA,YAAC,aAAAC;AAAA,YAAA;AAAA,cACC,UAAM,0CAAkB,QAAQ,UAAU;AAAA,cAC1C,WAAU;AAAA,cACV,OAAO,EAAE,iBAAiB,wBAAwB,OAAO,UAAU;AAAA,cAElE;AAAA;AAAA,UACH;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,IAAMC,UAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU,CAAC;AACb;;;AChFA,IAAAC,gBAAoC;AACpC,IAAAC,eAAiB;AACjB,IAAAC,yBAAwE;AACxE,IAAAC,qBAA0B;AAqDhB,IAAAC,sBAAA;AAnDK,SAAR,mBAAoC;AACzC,QAAM,EAAE,OAAAC,QAAO,YAAY,QAAI,iCAAS;AACxC,QAAM,aAAS,8BAAU;AACzB,QAAM,SAAU,QAAQ,UAAqB,aAAa,UAAU;AAEpE,QAAM,oBAAoBA,QAAO,UAAU;AAC3C,MAAI,CAAC,mBAAmB,QAAS,QAAO;AAExC,QAAM,UAAU,kBAAkB,WAAW;AAC7C,QAAM,mBAAmB,kBAAkB,cAAc;AACzD,QAAM,QAAQ,SAAS,kBAAkB,SAAS,GAAG;AACrD,QAAM,UAAU,SAAS,kBAAkB,WAAW,GAAG;AAEzD,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAgB,CAAC,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,IAAI;AAE3C,+BAAU,MAAM;AACd,mBAAe,YAAY;AACzB,UAAI,CAAC,UAAU,CAAC,kBAAkB;AAChC,mBAAW,KAAK;AAChB;AAAA,MACF;AACA,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,aAAa,UAAM,sCAAc,QAAQ,gBAAgB;AAC/D,YAAI,YAAY;AACd,gBAAM,cAAc,WAAW,UAAU,IAAI,CAAC,MAAW,EAAE,WAAW,CAAC,KAAK,CAAC;AAC7E,sBAAY,YAAY,MAAM,GAAG,KAAK,CAAC;AAAA,QACzC;AAAA,MACF,SAAS,OAAY;AACnB,YAAI,OAAO,UAAU,WAAW,KAAK;AACnC,kBAAQ,MAAM,4BAA4B,KAAK;AAAA,QACjD;AAAA,MACF,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AACA,cAAU;AAAA,EACZ,GAAG,CAAC,QAAQ,kBAAkB,KAAK,CAAC;AAEpC,QAAM,cAAsC;AAAA,IAC1C,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,gBAAgB,YAAY,OAAO,KAAK;AAE9C,MAAI,SAAS;AACX,WACE,6CAAC,aAAQ,WAAU,kBAAiB,OAAO,EAAE,iBAAiB,0BAA0B,GACtF,uDAAC,SAAI,WAAU,kCACb,wDAAC,SAAI,WAAU,iBACb;AAAA,mDAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,iBAAiB,UAAU,GAAG;AAAA,MAC9E,6CAAC,SAAI,WAAW,oBAAoB,aAAa,mBAC9C,WAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,MAC3B,6CAAC,SAAY,WAAU,2BAA0B,OAAO,EAAE,iBAAiB,UAAU,KAA3E,CAA8E,CACzF,GACH;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,SACE,6CAAC,aAAQ,WAAU,kBAAiB,OAAO,EAAE,iBAAiB,0BAA0B,GACtF,wDAAC,SAAI,WAAU,kCAEb;AAAA,kDAAC,SAAI,WAAU,0CACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,UAEnC;AAAA;AAAA,MACH;AAAA,MACA;AAAA,QAAC,aAAAC;AAAA,QAAA;AAAA,UACC,UAAM,0CAAkB,QAAQ,gBAAgB,gBAAgB,EAAE;AAAA,UAClE,WAAU;AAAA,UACV,OAAO,EAAE,OAAO,uBAAuB;AAAA,UACxC;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAGA,6CAAC,SAAI,WAAW,oBAAoB,aAAa,mBAC9C,mBAAS,IAAI,aACZ;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA;AAAA,MAFK,QAAQ;AAAA,IAGf,CACD,GACH;AAAA,KACF,GACF;AAEJ;AAEO,IAAMC,UAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU,CAAC;AACb;;;AC/GA,IAAAC,yBAAyB;AAuBf,IAAAC,sBAAA;AArBK,SAAR,cAA+B;AACpC,QAAM,EAAE,OAAAC,OAAM,QAAI,iCAAS;AAC3B,QAAM,UAAUA,QAAO,UAAU;AAEjC,MAAI,CAAC,SAAS,QAAS,QAAO;AAE9B,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,YAAY,QAAQ,aAAa,QAAQ;AAC/C,QAAM,YAAY,QAAQ,aAAa,QAAQ;AAC/C,QAAM,eAAe,QAAQ,gBAAgB,QAAQ;AACrD,QAAM,cAAc,QAAQ,eAAe,QAAQ;AAEnD,QAAM,WAAW,aAAa,aAAa,gBAAgB;AAC3D,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,QAAuF,CAAC;AAE9F,MAAI,WAAW;AACb,UAAM,KAAK;AAAA,MACT,MACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACvI,uDAAC,UAAK,GAAE,iRAAgR,GAC1R;AAAA,MAEF,OAAO;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,MAAM,OAAO,QAAQ,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,MAAI,WAAW;AACb,UAAM,KAAK;AAAA,MACT,MACE,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACvI;AAAA,qDAAC,UAAK,GAAE,+EAA8E;AAAA,QACtF,6CAAC,cAAS,QAAO,kBAAiB;AAAA,SACpC;AAAA,MAEF,OAAO;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,MAAM,UAAU,QAAQ,KAAK;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,MAAI,cAAc;AAChB,UAAM,WAAW,QAAQ,SAAS,QAAQ,WAAW,EAAE;AACvD,UAAM,KAAK;AAAA,MACT,MACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,uDAAC,UAAK,GAAE,olCAAmlC,GAC7lC;AAAA,MAEF,OAAO;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,MAAM,iBAAiB,QAAQ;AAAA,IACjC,CAAC;AAAA,EACH;AAEA,MAAI,aAAa;AACf,UAAM,KAAK;AAAA,MACT,MACE,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACvI;AAAA,qDAAC,UAAK,GAAE,gDAA+C;AAAA,QACvD,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,SAChC;AAAA,MAEF,OAAO;AAAA,MACP,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,SACE,6CAAC,aAAQ,WAAU,kBAAiB,OAAO,EAAE,iBAAiB,0BAA0B,GACtF,wDAAC,SAAI,WAAU,kCACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,QAEnC;AAAA;AAAA,IACH;AAAA,IAEA,6CAAC,SAAI,WAAU,0EACZ,gBAAM,IAAI,CAAC,MAAM,MAAM;AACtB,YAAM,UACJ;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UACV,OAAO,EAAE,aAAa,UAAU;AAAA,UAEhC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,uBAAuB;AAAA,gBAEtC,eAAK;AAAA;AAAA,YACR;AAAA,YACA,6CAAC,QAAG,WAAU,uDAAsD,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GACnH,eAAK,OACR;AAAA,YACA,6CAAC,OAAE,WAAU,uBAAsB,OAAO,EAAE,OAAO,oBAAoB,GACpE,eAAK,OACR;AAAA;AAAA;AAAA,QAfK;AAAA,MAgBP;AAGF,UAAI,KAAK,MAAM;AACb,eACE,6CAAC,OAAU,MAAM,KAAK,MAAM,QAAQ,KAAK,UAAU,aAAa,WAAW,QAAW,KAAI,uBACvF,qBADK,CAER;AAAA,MAEJ;AACA,aAAO;AAAA,IACT,CAAC,GACH;AAAA,KACF,GACF;AAEJ;AAEO,IAAMC,UAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU,CAAC;AACb;;;AC9HA,IAAAC,eAAiB;AACjB,IAAAC,yBAA4D;AAC5D,IAAAC,qBAA0B;AAuBlB,IAAAC,sBAAA;AArBO,SAAR,SAA0B;AAC/B,QAAM,EAAE,OAAAC,QAAO,aAAa,MAAM,QAAI,iCAAS;AAC/C,QAAM,aAAS,8BAAU;AACzB,QAAM,SAAU,QAAQ,UAAqB,aAAa,UAAU;AAEpE,QAAM,SAASA,QAAO,UAAU;AAChC,QAAM,YAAY,aAAa,QAAQ;AACvC,QAAM,UAAU,aAAa;AAE7B,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,YAAY,QAAQ,aAAa,IAAG,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,SAAS;AAG/E,QAAM,cAA+E,CAAC;AAEtF,MAAI,QAAQ,WAAW;AACrB,gBAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,KAAK,OAAO;AAAA,MACZ,MACE,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACvI;AAAA,qDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,QACvD,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,QAC9B,6CAAC,YAAO,IAAG,QAAO,IAAG,OAAM,GAAE,OAAM,MAAK,gBAAe;AAAA,SACzD;AAAA,IAEJ,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,UAAU;AACpB,gBAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,KAAK,OAAO;AAAA,MACZ,MACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,uDAAC,UAAK,GAAE,kEAAiE,GAC3E;AAAA,IAEJ,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,SAAS;AACnB,gBAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,KAAK,OAAO;AAAA,MACZ,MACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,uDAAC,UAAK,GAAE,+JAA8J,GACxK;AAAA,IAEJ,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,QAAQ;AAClB,gBAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,KAAK,OAAO;AAAA,MACZ,MACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,uDAAC,UAAK,GAAE,iTAAgT,GAC1T;AAAA,IAEJ,CAAC;AAAA,EACH;AAGA,QAAM,aAAa,QAAQ,UAAU;AACrC,QAAM,YAAa,YAAoB,SAAS,CAAC;AAEjD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,iBAAiB,2BAA2B,aAAa,UAAU;AAAA,MAE5E,wDAAC,SAAI,WAAU,kCACb;AAAA,sDAAC,SAAI,WAAU,oDAEb;AAAA,wDAAC,SACC;AAAA,yDAAC,aAAAC,SAAA,EAAK,UAAM,0CAAkB,QAAQ,GAAG,GAAG,WAAU,qBACnD,oBACC,6CAAC,SAAI,KAAK,SAAS,KAAK,WAAW,WAAU,6BAA4B,IAEzE,6CAAC,UAAK,WAAU,qBAAoB,OAAO,EAAE,OAAO,oBAAoB,GAAI,qBAAU,GAE1F;AAAA,YACC,eACC,6CAAC,OAAE,WAAU,oCAAmC,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GAC/F,uBACH;AAAA,YAGD,YAAY,SAAS,KACpB,6CAAC,SAAI,WAAU,gCACZ,sBAAY,IAAI,CAAC,MAAM,MACtB;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAM,KAAK;AAAA,gBACX,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,cAAY,KAAK;AAAA,gBACjB,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI;AAAA,gBAEjD,eAAK;AAAA;AAAA,cARD;AAAA,YASP,CACD,GACH;AAAA,aAEJ;AAAA,UAGC,UAAU,SAAS,KAClB,8CAAC,SACC;AAAA,yDAAC,QAAG,WAAU,uDAAsD,OAAO,EAAE,OAAO,oBAAoB,GAAG,yBAE3G;AAAA,YACA,6CAAC,SAAI,WAAU,yBACZ,oBAAU,IAAI,CAAC,SACd;AAAA,cAAC,aAAAA;AAAA,cAAA;AAAA,gBAEC,UAAM,uCAAe,MAAM,MAAM;AAAA,gBACjC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI;AAAA,gBAEjD,eAAK;AAAA;AAAA,cALD,KAAK;AAAA,YAMZ,CACD,GACH;AAAA,aACF;AAAA,UAIF,8CAAC,SACC;AAAA,yDAAC,QAAG,WAAU,uDAAsD,OAAO,EAAE,OAAO,oBAAoB,GAAG,mBAE3G;AAAA,YACA,8CAAC,SAAI,WAAU,iCAAgC,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GAC9F;AAAA,2BAAa,SAAS,6CAAC,OAAG,sBAAY,OAAM;AAAA,cAC5C,aAAa,SAAS,6CAAC,OAAG,sBAAY,OAAM;AAAA,eAC/C;AAAA,aACF;AAAA,WACF;AAAA,QAGA,6CAAC,SAAI,WAAU,mCAAkC,OAAO,EAAE,aAAa,UAAU,GAC/E,wDAAC,OAAE,WAAU,WAAU,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GAAG;AAAA;AAAA,UAClE;AAAA,WACV,GACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAEO,IAAMC,UAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU,CAAC;AACb;;;ACpKA,IAAAC,gBAAoC;AACpC,IAAAC,eAAiB;AACjB,IAAAC,yBAAsE;AACtE,IAAAC,qBAA0B;;;ACF1B,IAAM,mBAA2C;AAAA,EAC/C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AASO,SAAS,YAAY,QAAyB,WAAW,OAAe;AAC7E,QAAM,QAAQ,OAAO,WAAW,WAAW,WAAW,MAAM,IAAI;AAChE,MAAI,MAAM,KAAK,EAAG,QAAO,GAAG,QAAQ;AAEpC,QAAM,SAAS,iBAAiB,QAAQ,KAAK;AAE7C,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,QAAQ;AAAA,MACnC,OAAO;AAAA,MACP;AAAA,MACA,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,IACzB,CAAC,EAAE,OAAO,KAAK;AAAA,EACjB,QAAQ;AACN,WAAO,GAAG,QAAQ,IAAI,MAAM,QAAQ,CAAC,CAAC;AAAA,EACxC;AACF;;;ADrBQ,IAAAC,sBAAA;AApBO,SAAR,gBAAiC;AACtC,QAAM,EAAE,OAAAC,QAAO,YAAY,QAAI,iCAAS;AACxC,QAAM,EAAE,SAAS,iBAAiB,UAAU,aAAa,mBAAmB,QAAI,mCAAW;AAC3F,QAAM,EAAE,SAAS,SAAS,QAAI,qCAAa;AAC3C,QAAM,aAAS,8BAAU;AACzB,QAAM,SAAU,QAAQ,UAAqB,aAAa,UAAU;AACpE,QAAM,WAAW,aAAa,YAAY;AAE1C,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAS,CAAC;AAC1D,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AAGpD,+BAAU,MAAM;AACd,wBAAoB,CAAC;AACrB,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,SAAS,EAAE,CAAC;AAEhB,MAAI,CAAC,SAAS;AACZ,WACE,6CAAC,SAAI,WAAU,qBAAoB,OAAO,EAAE,iBAAiB,0BAA0B,GACrF,uDAAC,OAAE,WAAU,WAAU,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GAAG,+BAE5E,GACF;AAAA,EAEJ;AAEA,QAAM,SAAS,QAAQ,SAAS,CAAC;AACjC,QAAM,WAAW,QAAQ,YAAY,CAAC;AACtC,QAAM,cAAc,SAAS,SAAS;AAEtC,QAAM,iBAAiB,mBAAmB,SAAS,CAAC;AACpD,QAAM,QAAQ,WAAW,gBAAgB,SAAS,QAAQ,SAAS,GAAG;AACtE,QAAM,iBAAiB,WAAW,gBAAgB,kBAAkB,QAAQ,kBAAkB,GAAG;AACjG,QAAM,WAAW,iBAAiB,KAAK,iBAAiB;AAGxD,QAAM,eAAyC,CAAC;AAChD,WAAS,QAAQ,CAAC,MAAW;AAC3B,KAAC,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,QAAa;AACtC,UAAI,CAAC,aAAa,IAAI,IAAI,EAAG,cAAa,IAAI,IAAI,IAAI,CAAC;AACvD,UAAI,CAAC,aAAa,IAAI,IAAI,EAAE,SAAS,IAAI,KAAK,GAAG;AAC/C,qBAAa,IAAI,IAAI,EAAE,KAAK,IAAI,KAAK;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,kBAAkB,MAAM;AAC5B,QAAI,CAAC,eAAgB;AACrB,YAAQ;AAAA,MACN,WAAW,eAAe;AAAA,MAC1B,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,MACf,cAAc,eAAe,SAAS;AAAA,MACtC,OAAO,eAAe;AAAA,MACtB;AAAA,MACA,OAAO,OAAO,CAAC,GAAG,OAAO;AAAA,MACzB,MAAM,QAAQ;AAAA,IAChB,CAAC;AACD,mBAAe,IAAI;AACnB,aAAS;AACT,eAAW,MAAM,eAAe,KAAK,GAAG,GAAI;AAAA,EAC9C;AAEA,SACE,6CAAC,aAAQ,WAAU,iBAAgB,OAAO,EAAE,iBAAiB,0BAA0B,GACrF,wDAAC,SAAI,WAAU,4CAEb;AAAA,kDAAC,SAAI,WAAU,wCAAuC,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GACtG;AAAA,mDAAC,aAAAC,SAAA,EAAK,UAAM,0CAAkB,QAAQ,GAAG,GAAG,WAAU,uCAAsC,kBAAI;AAAA,MAChG,6CAAC,UAAK,eAAC;AAAA,MACP,6CAAC,aAAAA,SAAA,EAAK,UAAM,0CAAkB,QAAQ,kBAAkB,GAAG,WAAU,uCAAsC,sBAAQ;AAAA,MACnH,6CAAC,UAAK,eAAC;AAAA,MACP,6CAAC,UAAK,OAAO,EAAE,SAAS,GAAG,OAAO,oBAAoB,GAAI,kBAAQ,OAAM;AAAA,OAC1E;AAAA,IAEA,8CAAC,SAAI,WAAU,mDAEb;AAAA,oDAAC,SAEE;AAAA,eAAO,SAAS,KACf,8CAAC,SAAI,WAAU,0DAAyD,OAAO,EAAE,iBAAiB,UAAU,GAC1G;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,OAAO,gBAAgB,GAAG;AAAA,cAC/B,KAAK,QAAQ;AAAA,cACb,WAAU;AAAA;AAAA,UACZ;AAAA,UACC,YACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,iBAAiB,WAAW,OAAO,OAAO;AAAA,cACpD;AAAA;AAAA,UAED;AAAA,WAEJ;AAAA,QAID,OAAO,SAAS,KACf,6CAAC,SAAI,WAAU,8BACZ,iBAAO,IAAI,CAAC,KAAU,MACrB;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,MAAM,oBAAoB,CAAC;AAAA,YACpC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,aAAa,MAAM,mBAAmB,yBAAyB;AAAA,YACjE;AAAA,YAEA,uDAAC,SAAI,KAAK,IAAI,KAAK,KAAI,IAAG,WAAU,8BAA6B;AAAA;AAAA,UAP5D;AAAA,QAQP,CACD,GACH;AAAA,SAEJ;AAAA,MAGA,8CAAC,SAAI,WAAU,qCAEZ;AAAA,gBAAQ,UACP,6CAAC,OAAE,WAAU,qDAAoD,OAAO,EAAE,OAAO,uBAAuB,GACrG,kBAAQ,QACX;AAAA,QAIF;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,YAEnC,kBAAQ;AAAA;AAAA,QACX;AAAA,QAGA,8CAAC,SAAI,WAAU,gCACb;AAAA,uDAAC,UAAK,WAAU,qBAAoB,OAAO,EAAE,OAAO,oBAAoB,GACrE,sBAAY,OAAO,QAAQ,GAC9B;AAAA,UACC,YACC,6CAAC,UAAK,WAAU,0BAAyB,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GACxF,sBAAY,gBAAgB,QAAQ,GACvC;AAAA,WAEJ;AAAA,QAGC,eAAe,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,YAAY,MAAM,MAAM;AACzE,gBAAM,eAAe,gBAAgB,SAAS,KAAK,CAAC,MAAW,EAAE,SAAS,UAAU,GAAG;AACvF,iBACE,8CAAC,SAAqB,WAAU,QAC9B;AAAA,0DAAC,WAAM,WAAU,kCAAiC,OAAO,EAAE,OAAO,oBAAoB,GACnF;AAAA;AAAA,cAAW;AAAA,cAAE,6CAAC,UAAK,WAAU,eAAe,wBAAa;AAAA,eAC5D;AAAA,YACA,6CAAC,SAAI,WAAU,wBACZ,iBAAO,IAAI,CAAC,QAAQ;AACnB,oBAAM,aAAa,iBAAiB;AACpC,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,SAAS,MAAM;AACb,0BAAM,QAAQ,SAAS;AAAA,sBAAK,CAAC,MAC3B,EAAE,SAAS,KAAK,CAAC,MAAW,EAAE,SAAS,cAAc,EAAE,UAAU,GAAG;AAAA,oBACtE;AACA,wBAAI,MAAO,oBAAmB,KAAK;AAAA,kBACrC;AAAA,kBACA,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,iBAAiB,aAAa,yBAAyB;AAAA,oBACvD,OAAO,aAAa,SAAS;AAAA,oBAC7B,aAAa,aAAa,yBAAyB;AAAA,kBACrD;AAAA,kBAEC;AAAA;AAAA,gBAdI;AAAA,cAeP;AAAA,YAEJ,CAAC,GACH;AAAA,eA3BQ,UA4BV;AAAA,QAEJ,CAAC;AAAA,QAGD,8CAAC,SAAI,WAAU,QACb;AAAA,uDAAC,WAAM,WAAU,kCAAiC,OAAO,EAAE,OAAO,oBAAoB,GAAG,sBAEzF;AAAA,UACA,8CAAC,SAAI,WAAU,2CAA0C,OAAO,EAAE,aAAa,UAAU,GACvF;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,YAAY,KAAK,IAAI,GAAG,WAAW,CAAC,CAAC;AAAA,gBACpD,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,gBACrC;AAAA;AAAA,YAED;AAAA,YACA,6CAAC,UAAK,WAAU,iCAAgC,OAAO,EAAE,OAAO,oBAAoB,GACjF,oBACH;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,YAAY,WAAW,CAAC;AAAA,gBACvC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,gBACrC;AAAA;AAAA,YAED;AAAA,aACF;AAAA,WACF;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,wBAAwB,OAAO,OAAO;AAAA,YAE/D,wBAAc,WAAW;AAAA;AAAA,QAC5B;AAAA,QAGC,QAAQ,eACP,8CAAC,SAAI,WAAU,sBAAqB,OAAO,EAAE,aAAa,UAAU,GAClE;AAAA,uDAAC,QAAG,WAAU,8BAA6B,OAAO,EAAE,OAAO,oBAAoB,GAAG,yBAElF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI;AAAA,cAClD,yBAAyB,EAAE,QAAQ,QAAQ,YAAY;AAAA;AAAA,UACzD;AAAA,WACF;AAAA,SAEJ;AAAA,OACF;AAAA,KACF,GACF;AAEJ;AAEO,IAAMC,UAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU,CAAC;AAAA,EACX,aAAa,EAAE,WAAW,CAAC,GAAG,EAAE;AAAA,EAChC,YAAY,EAAE,WAAW,CAAC,gBAAgB,EAAE;AAC9C;;;AEzPA,IAAAC,yBAAqD;AACrD,IAAAC,qBAA0B;AAWlB,IAAAC,sBAAA;AATO,SAAR,cAA+B;AACpC,QAAM,EAAE,YAAY,QAAI,iCAAS;AACjC,QAAM,EAAE,WAAW,QAAI,sCAAc;AACrC,QAAM,aAAS,8BAAU;AACzB,QAAM,SAAU,QAAQ,UAAqB,aAAa,UAAU;AAEpE,MAAI,CAAC,YAAY;AACf,WACE,6CAAC,SAAI,WAAU,qBAAoB,OAAO,EAAE,iBAAiB,0BAA0B,GACrF,wDAAC,SAAI,WAAU,4CACb;AAAA,mDAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,iBAAiB,UAAU,GAAG;AAAA,MAC9E,6CAAC,SAAI,WAAU,uEACZ,WAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,OAChB,6CAAC,SAAY,WAAU,2BAA0B,OAAO,EAAE,iBAAiB,UAAU,KAA3E,CAA8E,CACzF,GACH;AAAA,OACF,GACF;AAAA,EAEJ;AAEA,QAAM,WAAW,WAAW,UAAU,IAAI,CAAC,MAAW,EAAE,WAAW,CAAC,KAAK,CAAC;AAE1E,SACE,6CAAC,aAAQ,WAAU,iBAAgB,OAAO,EAAE,iBAAiB,0BAA0B,GACrF,wDAAC,SAAI,WAAU,4CAEb;AAAA,kDAAC,SAAI,WAAU,iBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,UAEnC,qBAAW;AAAA;AAAA,MACd;AAAA,MACC,WAAW,eACV,6CAAC,OAAE,WAAU,qBAAoB,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GAChF,qBAAW,aACd;AAAA,OAEJ;AAAA,IAGC,SAAS,SAAS,IACjB,6CAAC,SAAI,WAAU,iEACZ,mBAAS,IAAI,CAAC,YACb;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA;AAAA,MAFK,QAAQ;AAAA,IAGf,CACD,GACH,IAEA,6CAAC,SAAI,WAAU,qBACb,uDAAC,OAAE,WAAU,WAAU,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GAAG,mDAE5E,GACF;AAAA,KAEJ,GACF;AAEJ;AAEO,IAAMC,UAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU,CAAC;AAAA,EACX,aAAa,EAAE,WAAW,CAAC,GAAG,EAAE;AAAA,EAChC,YAAY,EAAE,WAAW,CAAC,YAAY,EAAE;AAC1C;;;ACzEA,IAAAC,eAAiB;AACjB,IAAAC,yBAA0D;AAC1D,IAAAC,qBAA0B;AAoBd,IAAAC,sBAAA;AAjBG,SAAR,cAA+B;AACpC,QAAM,EAAE,YAAY,QAAI,iCAAS;AACjC,QAAM,EAAE,OAAO,YAAY,YAAY,eAAe,QAAI,qCAAa;AACvE,QAAM,aAAS,8BAAU;AACzB,QAAM,SAAU,QAAQ,UAAqB,aAAa,UAAU;AACpE,QAAM,WAAW,aAAa,YAAY;AAE1C,QAAM,QAAQ,OAAO,eAAe,aAAa,WAAW,IAAI;AAEhE,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,6CAAC,SAAI,WAAU,qBAAoB,OAAO,EAAE,iBAAiB,0BAA0B,GACrF,wDAAC,SAAI,WAAU,kCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,iBAAiB,UAAU;AAAA,UAEpC,wDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GACpJ;AAAA,yDAAC,UAAK,GAAE,kDAAiD;AAAA,YACzD,6CAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI;AAAA,YACnC,6CAAC,UAAK,GAAE,uBAAsB;AAAA,aAChC;AAAA;AAAA,MACF;AAAA,MACA,6CAAC,QAAG,WAAU,0BAAyB,OAAO,EAAE,OAAO,oBAAoB,GAAG,gCAE9E;AAAA,MACA,6CAAC,OAAE,WAAU,gBAAe,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GAAG,uDAEjF;AAAA,MACA;AAAA,QAAC,aAAAC;AAAA,QAAA;AAAA,UACC,UAAM,0CAAkB,QAAQ,kBAAkB;AAAA,UAClD,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF,GACF;AAAA,EAEJ;AAEA,SACE,6CAAC,aAAQ,WAAU,iBAAgB,OAAO,EAAE,iBAAiB,0BAA0B,GACrF,wDAAC,SAAI,WAAU,4CACb;AAAA,kDAAC,QAAG,WAAU,uCAAsC,OAAO,EAAE,OAAO,oBAAoB,GAAG;AAAA;AAAA,MAEzF,8CAAC,UAAK,WAAU,8BAA6B,OAAO,EAAE,SAAS,IAAI,GAAG;AAAA;AAAA,QAClE,MAAM;AAAA,QAAO;AAAA,QAAE,MAAM,WAAW,IAAI,SAAS;AAAA,QAAQ;AAAA,SACzD;AAAA,OACF;AAAA,IAGA,6CAAC,SAAI,WAAU,YAAW,OAAO,EAAE,aAAa,UAAU,GACvD,gBAAM,IAAI,CAAC,SACV,8CAAC,SAAyB,WAAU,mBAEjC;AAAA,WAAK,SACJ;AAAA,QAAC,aAAAA;AAAA,QAAA;AAAA,UACC,UAAM,0CAAkB,QAAQ,aAAa,KAAK,IAAI,EAAE;AAAA,UACxD,WAAU;AAAA,UAEV;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,KAAK;AAAA,cACV,KAAK,KAAK;AAAA,cACV,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA,MACF;AAAA,MAIF,8CAAC,SAAI,WAAU,kBACb;AAAA;AAAA,UAAC,aAAAA;AAAA,UAAA;AAAA,YACC,UAAM,0CAAkB,QAAQ,aAAa,KAAK,IAAI,EAAE;AAAA,YACxD,WAAU;AAAA,YACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,YAEnC,eAAK;AAAA;AAAA,QACR;AAAA,QACC,KAAK,gBACJ,6CAAC,OAAE,WAAU,gBAAe,OAAO,EAAE,OAAO,qBAAqB,SAAS,IAAI,GAC3E,eAAK,cACR;AAAA,QAEF,6CAAC,OAAE,WAAU,8BAA6B,OAAO,EAAE,OAAO,oBAAoB,GAC3E,sBAAY,WAAW,KAAK,KAAK,IAAI,KAAK,UAAU,QAAQ,GAC/D;AAAA,QAGA,8CAAC,SAAI,WAAU,gCACb;AAAA,wDAAC,SAAI,WAAU,mDAAkD,OAAO,EAAE,aAAa,UAAU,GAC/F;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,eAAe,KAAK,WAAW,EAAE;AAAA,gBAChD,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,gBACrC;AAAA;AAAA,YAED;AAAA,YACA,6CAAC,UAAK,WAAU,aAAY,OAAO,EAAE,OAAO,oBAAoB,GAC7D,eAAK,UACR;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,eAAe,KAAK,WAAW,CAAC;AAAA,gBAC/C,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,oBAAoB;AAAA,gBACrC;AAAA;AAAA,YAED;AAAA,aACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,WAAW,KAAK,SAAS;AAAA,cACxC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,UAAU;AAAA,cAC3B;AAAA;AAAA,UAED;AAAA,WACF;AAAA,SACF;AAAA,SA9DQ,KAAK,SA+Df,CACD,GACH;AAAA,IAGA,8CAAC,SAAI,WAAU,sBAAqB,OAAO,EAAE,aAAa,UAAU,GAClE;AAAA,oDAAC,SAAI,WAAU,0CACb;AAAA,qDAAC,UAAK,WAAU,2BAA0B,OAAO,EAAE,OAAO,oBAAoB,GAAG,mBAEjF;AAAA,QACA,6CAAC,UAAK,WAAU,qBAAoB,OAAO,EAAE,OAAO,oBAAoB,GACrE,sBAAY,OAAO,QAAQ,GAC9B;AAAA,SACF;AAAA,MACA;AAAA,QAAC,aAAAA;AAAA,QAAA;AAAA,UACC,UAAM,0CAAkB,QAAQ,WAAW;AAAA,UAC3C,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF;AAAA,KACF,GACF;AAEJ;AAEO,IAAMC,UAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU,CAAC;AAAA,EACX,aAAa,EAAE,WAAW,CAAC,GAAG,EAAE;AAAA,EAChC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE;AACpC;;;ACzJA,IAAAC,0BAA6B;AAMrB,IAAAC,uBAAA;AAJO,SAAR,kBAAmC;AACxC,SACE,8CAAC,SAAI,WAAU,gBAAe,OAAO,EAAE,iBAAiB,0BAA0B,GAChF,wDAAC,SAAI,WAAU,0DACb,wDAAC,wCAAa,GAChB,GACF;AAEJ;AAEO,IAAMC,WAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU,CAAC;AAAA,EACX,aAAa,EAAE,WAAW,CAAC,GAAG,EAAE;AAAA,EAChC,YAAY,EAAE,WAAW,CAAC,UAAU,EAAE;AACxC;;;ACCO,IAAM,yBAA0E;AAAA,EACrF,UAAU,EAAE,WAAW,QAAe,OAAqB;AAAA,EAC3D,gBAAgB,EAAE,WAAW,cAAqB,QAAQC,QAAmB;AAAA,EAC7E,QAAQ,EAAE,WAAW,MAAa,QAAQA,QAAW;AAAA,EACrD,qBAAqB,EAAE,WAAW,kBAAyB,QAAQA,QAAuB;AAAA,EAC1F,gBAAgB,EAAE,WAAW,aAAoB,QAAQA,QAAkB;AAAA,EAC3E,UAAU,EAAE,WAAW,QAAe,QAAQA,QAAa;AAAA,EAC3D,kBAAkB,EAAE,WAAW,eAAsB,QAAQA,QAAoB;AAAA,EACjF,gBAAgB,EAAE,WAAW,aAAoB,QAAQA,QAAkB;AAAA,EAC3E,aAAa,EAAE,WAAW,aAAoB,QAAQA,QAAkB;AAAA,EACxE,iBAAiB,EAAE,WAAW,iBAAwB,QAAQA,SAAsB;AACtF;AAEO,IAAM,uBAAwE,CAAC;;;AClCtF;AAAA,EACE,MAAQ;AAAA,EACR,UAAY;AAAA,IACV,OAAS;AAAA,MACP,SAAW;AAAA,MACX,YAAc;AAAA,MACd,MAAQ;AAAA,MACR,QAAU;AAAA,MACV,MAAQ;AAAA,IACV;AAAA,IACA,QAAU;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,MACd,QAAU;AAAA,MACV,YAAc;AAAA,MACd,YAAc;AAAA,IAChB;AAAA,IACA,MAAQ;AAAA,MACN,SAAW;AAAA,MACX,iBAAmB;AAAA,MACnB,SAAW;AAAA,MACX,YAAc;AAAA,MACd,YAAc;AAAA,MACd,YAAc;AAAA,MACd,gBAAkB;AAAA,MAClB,cAAgB;AAAA,MAChB,WAAa;AAAA,IACf;AAAA,IACA,UAAY;AAAA,MACV,SAAW;AAAA,MACX,SAAW;AAAA,MACX,YAAc;AAAA,MACd,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,IACA,SAAW;AAAA,MACT,SAAW;AAAA,MACX,SAAW;AAAA,MACX,WAAa;AAAA,MACb,OAAS;AAAA,MACT,WAAa;AAAA,MACb,OAAS;AAAA,MACT,cAAgB;AAAA,MAChB,UAAY;AAAA,MACZ,aAAe;AAAA,MACf,SAAW;AAAA,IACb;AAAA,IACA,QAAU;AAAA,MACR,aAAe;AAAA,MACf,YAAc;AAAA,MACd,WAAa;AAAA,MACb,WAAa;AAAA,MACb,UAAY;AAAA,MACZ,SAAW;AAAA,MACX,QAAU;AAAA,IACZ;AAAA,IACA,cAAgB;AAAA,MACd,SAAW;AAAA,MACX,MAAQ;AAAA,MACR,iBAAmB;AAAA,MACnB,WAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV,gBAAkB;AAAA,MAChB,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,IACA,UAAY;AAAA,MACV,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,IACA,QAAU;AAAA,MACR,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,IACA,qBAAuB;AAAA,MACrB,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,IACA,gBAAkB;AAAA,MAChB,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,IACA,UAAY;AAAA,MACV,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,MACd,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,IACA,mBAAmB;AAAA,MACjB,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,IACA,aAAa;AAAA,MACX,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,IACA,iBAAiB;AAAA,MACf,MAAQ;AAAA,MACR,UAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,QAAU;AAAA,IACR,QAAU;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAU;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAa;AAAA,IACX,gBAAkB,EAAE,OAAS,CAAC,cAAc,EAAE;AAAA,IAC9C,YAAc,EAAE,OAAS,CAAC,iBAAiB,EAAE;AAAA,IAC7C,MAAQ,EAAE,OAAS,CAAC,WAAW,EAAE;AAAA,IACjC,UAAY,EAAE,OAAS,CAAC,eAAe,EAAE;AAAA,EAC3C;AACF;;;AdxHA,IAAM,YAAQ,+BAAY;AAAA,EACxB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,EACP;AAAA,EACA,aAAa;AAAA,EACb,MAAM,CAAC,UAAU,gBAAgB,WAAW,WAAW,YAAY;AAAA,EACnE;AAAA,EACA,eAAe;AAAA,EACf,UAAU;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF,CAAC;AAED,IAAO,gBAAQ;","names":["import_theme_sdk","theme","Link","import_storefront_api","import_jsx_runtime","theme","schema","import_link","import_storefront_api","import_navigation","import_jsx_runtime","theme","Link","schema","import_react","import_link","import_storefront_api","import_navigation","import_jsx_runtime","theme","Link","schema","import_storefront_api","import_jsx_runtime","theme","schema","import_link","import_storefront_api","import_navigation","import_jsx_runtime","theme","Link","schema","import_react","import_link","import_storefront_api","import_navigation","import_jsx_runtime","theme","Link","schema","import_storefront_api","import_navigation","import_jsx_runtime","schema","import_link","import_storefront_api","import_navigation","import_jsx_runtime","Link","schema","import_storefront_api","import_jsx_runtime","schema","schema"]}