icon

Custom Event Setup

×

Click on the elements you want to track as custom events. Selected elements will appear in the list below.

Selected Elements (0)

    9 Recipes for 9 Nights of Navratri

    Navratri is one of the most vibrant and significant Hindu festivals celebrated across India. It spans 9 nights and 10 days, where devotees worship goddess Durga, fast, and engage in cultural festivities.

    Navratri is celebrated in different ways across the country. Even with these diverse ways of celebration, the one thing that connects the whole country is delicious food. People in various Indian states prepare unique dishes to honour goddess Durga. We will explore nine delectable recipes from different states, each with its unique flavour that you can prepare and relish this Navratri.

    1. Mishti Doi (Sweet Yogurt) – West Bengal:

    Mishti Doi is a delightful Bengali dessert made with sweetened, caramelized yogurt. These are traditionally made in earthen pots which helps incorporate earthy and unique flavour.  Preparing mishti doi is not the same as preparing a regular curd or dahi. Sugar or jaggery is added to hung curd and then chilled for a few hours to achieve the creamy texture.

    1. Rajgira Paratha - Rajasthan:

    Rajgira Paratha is a gluten-free option popular during the fasting season. These are crispy brown puffy breads made from amaranth flour and mashed potatoes. You can make this into an interesting recipe by adding paneer to the dough.

    1. Puran Poli – Maharashtra:

    The name "Puran Poli" is derived from "Puran," which means sweet stuffing. Puran Poli is a sweet flatbread filled with a mixture of chana dal (split chickpeas), jaggery, and spices. In the State of Maharashtra, it represents the harvest season and the good fortune that comes with it during Navratri.

    1. Babru - Himachal Pradesh:

    Babru is a traditional breakfast recipe from the state of Himachal Pradesh. This dish is made from a hearty mixture of black gram and wheat flour, cooked to a wholesome consistency, and is often cooked as an offering to Goddess Durga during Navratri.

    1. Sabudana Khichdi - Gujarat:

    Sabudana Khichdi is a common fasting food made from soaked tapioca pearls, peanuts, and spices. Not only does it have a crunchy yet smooth texture but it is quite filling. Probably, this is the reason why it is a go-to recipe for many people during fast.

    1. Kadalai Parippu Pradhaman - Kerala:

    Kadalai Parippu Pradhaman is a sweet recipe made with jaggery, boiled chana dal/ Bengal gram, and coconut milk. This creamy chana dal dessert is typically made during any festivals in Kerala, especially during Navratri and Onam.

    1. Lauki Ki Kheer - Uttar Pradesh:

    Lauki means bottle gourd. Make this into a dessert and suddenly you will keep coming back for more! Lauki Ki Kheer, or bottle gourd pudding, is a traditional dessert enjoyed during Navratri. This sweet pudding is made from bottle gourd, milk, ghee, and sugar. It is garnished with cardamom and some nuts.

    1. Kuttu Ki Puri – Punjab:

    Kuttu Ki Puri is a deep-fried bread made from buckwheat flour, a popular fasting staple. When prepared properly, kuttu puri can be incredibly crispy, fluffy, and flavourful. The texture of buckwheat is rich and dense. Kuttu puri has a significantly darker brown hue. Since this dish tends to generate heat in our body, it is best served with curd. It is often enjoyed with potato curry during Navratri.

    1. Sundal – Tamil Nadu:

    Sundal is a South Indian dish made from cooked legumes, typically chickpeas or lentils. This dish features cooked legumes like chickpeas or lentils, seasoned with spices and garnished with coconut. Sundal is not only delicious but also symbolizes the celebration of good over evil, as it is often shared with friends and family during Navratri festivities.

    These dishes will not only tantalize your taste buds but also allow you to partake in the age-old traditions that make Navratri a truly special time of the year. Enjoy the feast, celebrate the victory, and savour the culture of India during these 9 nights of Navratri!

    If you are observing fasts this Navratri, here’s the Top 3 Navratri Vrat (Fasting) Recipes.

    You have successfully subscribed!
    This email has been registered
    ", defaultCountry, geoCountries.includes(defaultCountry) ); return geoCountries.includes(defaultCountry); }; const startOTPObserverIfEligible = async () => { const shouldRunOTP = await checkDefaultCountry(); if (shouldRunOTP) { codkLog("observePreOrderOTPEnabled running"); observePreOrderOTPEnabled(); } else { codkLog("OTP observer skipped due to geo restrictions."); enableNormalCheckout(); } }; try { console.log( "%c████████████ COD King 2 ████████████", "font-weight: bold; font-size: 14px; background: red; color: white; padding: 4px 8px; border-radius: 4px;" ); disableNormalCheckout(); setTimeout(async function () { codkLog("before calling setting from extension"); let settings; const settingsChanged = sessionStorage.getItem("codk_settings_changed"); const settingsStr = sessionStorage.getItem("settingSession"); if (settingsChanged || !settingsStr) { if (settingsChanged) { sessionStorage.removeItem("codk_settings_changed"); codkLog("Metafield changed - calling fetchSettings() to update settingSession"); } const response = await fetchSettings(); if (response) { const newSettings = codkMapSettingsToCamel({ ...response, routeUrl: ROUTE_URL.replace(/\/$/, ""), shopDomain: window.Shopify.shop, }); sessionStorage.setItem("settingSession", JSON.stringify(newSettings)); startOTPObserverIfEligible(); if (newSettings?.partialPaymentEnabled === true) { callPartialRuleSets(); callPartialDummyVariantId(); } settings = newSettings; } else { codkLog("Failed to load settings from server."); enableNormalCheckout(); return; } } else { settings = JSON.parse(settingsStr); const needsMigration = settings && !("enablePreOrderOtp" in settings) && "enable_pre_order_otp" in settings; if (needsMigration) { const migratedSettings = codkMapSettingsToCamel(settings); sessionStorage.setItem( "settingSession", JSON.stringify(migratedSettings) ); settings = migratedSettings; } startOTPObserverIfEligible(); if (settings?.partialPaymentEnabled === true) { const ruleSets = JSON.parse(sessionStorage.getItem("ruleSets")); if (!ruleSets) { callPartialRuleSets(); } const variantId = sessionStorage.getItem("partialDummyVariantId"); if (!variantId) { callPartialDummyVariantId(); } } } if (settings?.partialPaymentEnabled === true) { initProductHiding(); } loadScript(); }, 10); } catch (e) { codkLog("Error Loading OTP Box, Please reach out to us via chat bubble"); enableNormalCheckout(); } })(); }; const initSvelteApp = function(buttonBlocking, settings) { window.codkInitSvelteApp = () => initSvelteApp(buttonBlocking, settings); // Ensure ROUTE_URL is set if (typeof window.codkingRouteUrl === 'undefined' || !window.codkingRouteUrl || window.codkingRouteUrl.trim() === '') { console.error("❌ ROUTE_URL is empty in initSvelteApp!"); if (buttonBlocking) buttonBlocking.removeButtonListeners(); return; } const ROUTE_URL = window.codkingRouteUrl; const DEBUG = true; const codkLog = (msg, ...args) => { if (DEBUG) console.log(`[notifik_svelte.liquid] ${msg}`, ...args); }; codkLog("***************************** notifik_svelte.liquid loaded (SKELETON) *****************************"); codkLog("✅ web_ux_version is 2, initializing Svelte app"); // If buttonBlocking not provided, unblock and exit if (!buttonBlocking) { console.error("❌ buttonBlocking not provided to initSvelteApp!"); return; } const isMobile = () => { const viewportWidth = window.parent && window.parent !== window ? window.parent.innerWidth : window.innerWidth; return viewportWidth <= 640; }; const showIframe = (iframe) => { if (!iframe) return; iframe.setAttribute('data-visible', 'true'); // Fire global event when the iframe-based modal becomes visible // (Do NOT fire this on iframe creation because the iframe is preloaded.) try { if (!window.codkOtpModalOpen) { const parentWindow = window.parent || window; parentWindow.dispatchEvent(new Event("codking:otpModalOpened")); window.codkOtpModalOpen = true; codkLog("📣 Dispatched codking:otpModalOpened"); // IMMEDIATE FALLBACK: If cart drawer manager isn't ready yet (first open), // directly hide cart drawers using Strategy 6 logic (Razorpay Magic Checkout pattern). // This is the EXACT same logic as initializeCartDrawerHidingLogicSix.closeCartDrawerSafely() const hideCartDrawerFallback = function() { try { const cartDrawerLayouts = getCartDrawerLayouts(); // Iterate through all cart drawer layout selectors (from COD_CART_DRAWER_LAYOUT) for (const selector of cartDrawerLayouts) { try { const element = document.querySelector(selector); if (!element) continue; // If it's a component with close() method, use it (like Razorpay Magic Checkout) const elementAny = element; if (typeof elementAny.close === "function") { try { elementAny.close(); codkLog(" 🔒 Fallback: Closed via " + selector + ".close()"); return true; } catch (e) { codkLog(" ⚠️ Fallback: " + selector + ".close() failed:", e); // continue to try dialog fallback } } // Fallback: find dialog[open] inside the cart drawer element const dialog = element.querySelector("dialog[open]"); if (dialog) { try { dialog.close(); dialog.removeAttribute("open"); codkLog(" 🔒 Fallback: Closed dialog inside " + selector); return true; } catch (e) { codkLog(" ⚠️ Fallback: Failed to close dialog in " + selector + ":", e); // continue to next selector } } // If the element itself is a dialog with open attribute if (element.tagName === "DIALOG" && element.hasAttribute("open")) { try { element.close(); element.removeAttribute("open"); codkLog(" 🔒 Fallback: Closed dialog " + selector); return true; } catch (e) { codkLog(" ⚠️ Fallback: Failed to close dialog " + selector + ":", e); // continue to next selector } } } catch (e) { // Skip invalid selectors codkLog(" ⚠️ Fallback: Invalid selector " + selector + ":", e); } } return false; } catch (e) { codkLog("⚠️ Fallback hide failed:", e); return false; } }; // Try immediate fallback first (works even if Svelte cart drawer manager hasn't loaded) hideCartDrawerFallback(); // Also retry calling the handler directly until it exists (for full strategy support) const tryHideDrawer = function(attempt) { try { if (typeof parentWindow.codkingHideDrawer === "function") { parentWindow.codkingHideDrawer(); codkLog("📣 Called codkingHideDrawer() directly"); return; } } catch (e) {} if ((attempt || 0) < 40) { setTimeout(function() { tryHideDrawer((attempt || 0) + 1); }, 50); } }; tryHideDrawer(0); } } catch (e) { // fail silently } codkLog("✅ Iframe shown (CSS from Svelte)"); }; const hideIframe = (iframe) => { if (!iframe) return; iframe.setAttribute('data-visible', 'false'); // Fire global event when the iframe-based modal is hidden try { if (window.codkOtpModalOpen) { (window.parent || window).dispatchEvent(new Event("codking:otpModalClosed")); window.codkOtpModalOpen = false; codkLog("📣 Dispatched codking:otpModalClosed"); } } catch (e) { // fail silently } codkLog("✅ Iframe hidden (CSS from Svelte)"); }; if (!window.codkIframeDestroyListenerAdded) { window.codkIframeDestroyListenerAdded = true; window.addEventListener('message', (event) => { if ( event.data && typeof event.data === 'object' && event.data.type === 'CODK_DESTROY_IFRAME' ) { const iframeId = event.data.iframeId || 'codk-full-modal-svelte'; const targetIframe = document.getElementById(iframeId); if (targetIframe && targetIframe.parentNode) { codkLog("🧹 Removing iframe via CODK_DESTROY_IFRAME message:", iframeId); targetIframe.parentNode.removeChild(targetIframe); // If the modal was open, ensure we emit a close event on destroy try { if (window.codkOtpModalOpen) { (window.parent || window).dispatchEvent(new Event("codking:otpModalClosed")); window.codkOtpModalOpen = false; codkLog("📣 Dispatched codking:otpModalClosed (destroy)"); } } catch (e) { // fail silently } } else { codkLog("ℹ️ CODK_DESTROY_IFRAME: iframe not found (maybe already removed)", iframeId); } const wrapper = document.getElementById('codk-modal-wrapper'); if (wrapper) { wrapper.setAttribute('data-visible', 'false'); wrapper.style.display = 'none'; } iframe = null; window.codkSvelteInitialized = false; window.codkingSvelteReady = false; window.codkSvelteAppMounted = false; window.codkModalShowingSpinner = false; setTimeout(() => { iframe = ensureIframe(); if (typeof window.codkInitSvelteApp === "function") { window.codkInitSvelteApp(); } }, 50); return; } if ( event.data && typeof event.data === 'object' && event.data.type === 'CODK_REDIRECT_TO_CHECKOUT' ) { codkLog("🚀 Received CODK_REDIRECT_TO_CHECKOUT message"); if (typeof enableNormalCheckout === "function") { enableNormalCheckout(); } try { window.location.href = "/checkout"; } catch (redirectError) { console.warn("[app-embed.liquid] ⚠️ Parent redirect failed:", redirectError); } return; } }); } const ensureIframe = () => { let iframeElement = document.getElementById('codk-full-modal-svelte'); if (!iframeElement) { iframeElement = document.createElement('iframe'); iframeElement.id = 'codk-full-modal-svelte'; iframeElement.setAttribute('data-visible', 'false'); document.body.appendChild(iframeElement); codkLog("✅ Iframe created (CSS handled by Svelte)", { isMobile: isMobile() }); } else { codkLog("⏸️ Iframe already exists - reusing existing iframe"); } return iframeElement; }; let iframe = ensureIframe(); if (window.codkSvelteInitialized) { codkLog("⏸️ Svelte app already initialized - skipping duplicate initialization"); } else { window.codkSvelteInitialized = true; const initializeSvelteApp = () => { try { if (iframe.contentWindow && iframe.contentWindow.codkingSvelteReady) { codkLog("⏸️ Svelte app already ready in iframe - skipping initialization"); return; } try { const iframeDoc = iframe.contentWindow.document; if (iframeDoc && iframeDoc.body) { const existingScript = iframeDoc.querySelector('script[type="module"][src*="notifik_svelte"]'); if (existingScript) { codkLog("⏸️ Script tag already exists in iframe - skipping initialization (app may be loading)"); return; } } } catch (e) { codkLog("⚠️ Could not check iframe document (may not be ready yet):", e.message); } codkLog("🚀 Initializing iframe with Svelte app..."); const iframeDoc = iframe.contentWindow.document; iframeDoc.open(); const bodyStyle = isMobile() ? 'margin:0;padding:0;background:transparent;height:100vh;' : 'margin:0;padding:0;background:transparent;height:auto;min-height:100%;'; const htmlStyle = isMobile() ? 'background:transparent;height:100%;' : 'background:transparent;height:auto;min-height:100%;'; window.codkSvelteAppMounted = false; iframeDoc.write( '' + '' + 'COD King OTP' + '' + '' + '
    ' + '
    tag in theme.liquid 2. The quiz will automatically open when clicking any link with href="#kitchen-quiz" Example button/link: Find Your Perfect Colour ═══════════════════════════════════════════════════════════════════════════ -->

    Kitchen Energy Quiz

    Discover the colour that feels like home

    Your kitchen isn't just where you cook — it's where you reset, gather, and create. This quiz reveals the ceramic colour that matches your energy, your rhythm, and the way you move through life.

    Ceramic Colour Quiz
    1 of 4