{"browserTitle":"Jodi Pudge - Food Photographer + Director","copyright":"&#169; Jodi Pudge 2025               ","metaDescription":"Toronto Food Photographer & Director - Jodi Pudge","metaKeywords":"Toronto Food Photographer Director, Jodi Pudge Photography,Toronto, Canada, Food, Lifestyle , PudgeCo","localMasterVersion":"16.0","backgroundImages":[],"filters":["ABOUT","BLOG","BOTTLE SAMPLES","CONTACT","Create PDF","INFO","KIDS","LANDING OPTIONS","NEW LIBRARY","NEW LOGO","OLD LIBRARY","Updated - 01 Top Picks","Updated - 02 Short List","Updated-Website Gathering","2025 Site Refresh"],"portfolioEmailMessage":"The fine print: All images are copyright &#169; Jodi Pudge 2025.   Email us, we'd be happy to talk about usage or future projects.  Cheers! jodi@jodipudge.com  www.jodipudge.com","socialLinks":[],"useHTML":true,"globalBrowserTitle":true,"facebookImage":"Jodi_Selfie_sq_crop_sm.jpg","facebookAdmins":"","facebookUseMeta":true,"podUseDesktop":false,"padUseDesktop":true,"generalEmail":"studio@jodipudge.com","inquiryTitle":"Check out these images from Jodi Pudge Photography","inquiryInfo":"","lang":"en","betaProgramVisible":true,"betaProgramEnabled":false,"advancedSeo":false,"adminSortDefault":"dateAdded descending","enablePinterest":false,"enableCookieBanner":false,"currentTemplate":22,"cookieBannerPosition":"bottom","cookieBannerLink":"http://aboutcookies.org","cookieBannerMessage":"We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.","revision":308,"cdnSslUri":"/pf-media","favicon":"SymbolInCircle2_FINAL.ico","siteHead":"<style>\n  .logoText {\n    position: fixed !important;\n    top: 10px !important;\n    left: 20px !important;\n\n    will-change: transform;\n    backface-visibility: hidden;\n    transform-origin: top left;\n\n    width: calc(100vw - 50px) !important;\n    min-width: 250px !important;\n    height: auto !important;\n    max-height: calc(100vh - 60px) !important;\n\n    /* instant switch */\n    transition: none !important;\n  }\n\n  .site-menu {\n    position: fixed !important;\n    top: 0;\n    left: 0;\n\n    will-change: width;\n    backface-visibility: hidden;\n    height: 20vw !important;\n    transition: none !important;\n  }\n</style>","siteBody":"<script>\n  function waitForDxAndRun(cb) {\n    const iv = setInterval(() => {\n      if (\n        typeof DX_MODEL !== 'undefined' &&\n        typeof dx       !== 'undefined' &&\n        dx.site?.events?.dispatchEvent\n      ) {\n        clearInterval(iv);\n        cb();\n      }\n    }, 100);\n  }\n\n  waitForDxAndRun(function() {\n    const logo = document.querySelector('.logoText');\n    const menu = document.querySelector('.site-menu');\n\n    const minLogoWidth     = 250;\n    const menuEndWidth     = 108;\n    const initialMenuRatio = 0.25;\n\n    let initialLogoWidth, minScale, initialMenuWidth;\n    let prevScale = null, prevMwPx = null;\n\n    function clamp(v, mn, mx) {\n      return Math.min(Math.max(v, mn), mx);\n    }\n\n    function calcSizes() {\n      initialLogoWidth  = window.innerWidth - 40;\n      minScale          = minLogoWidth / initialLogoWidth;\n      initialMenuWidth  = Math.round(window.innerWidth * initialMenuRatio);\n    }\n\n    function applyScale(s) {\n      const rounded = Math.round(s * 1000) / 1000;\n      if (logo && rounded !== prevScale) {\n        logo.style.transform = `scale(${rounded})`;\n        prevScale = rounded;\n      }\n    }\n\n    function applyMenuWidth(px) {\n      if (px !== prevMwPx) {\n        DX_MODEL.layout.menuWidth = `${px}px`;\n        if (menu) menu.style.width = `${px}px`;\n        setTimeout(() => {\n          dx.site.menuController.events.dispatchEvent('resizeEnd');\n        }, 100);\n        prevMwPx = px;\n      }\n    }\n\n    function initLayout() {\n      applyScale(1);\n      applyMenuWidth(initialMenuWidth);\n    }\n\n    function setStatic() {\n      applyScale(minScale);\n      applyMenuWidth(menuEndWidth);\n    }\n\n    function applyLayout() {\n      const path     = window.location.pathname.toLowerCase();\n      const isThumbs = path.includes('thumbs');\n      const isHome   = (path === '/' || path === '');\n      if (isThumbs || isHome) initLayout();\n      else                   setStatic();\n    }\n\n    // watch URL changes, but skip /Info/1\n    let lastPath = '';\n    function checkURL() {\n      const p = window.location.pathname;\n      if (p === lastPath) return;\n      lastPath = p;\n      if (p.toLowerCase() === '/info/1') {\n        // do nothing—keep whatever state you already have\n        return;\n      }\n      applyLayout();\n    }\n\n    // initial\n    calcSizes();\n    checkURL();\n\n    // recalc & reapply on resize\n    window.addEventListener('resize', () => {\n      calcSizes();\n      // if currently on /Info/1, do *not* auto-adjust until user navigates away\n      if (window.location.pathname.toLowerCase() !== '/info/1') {\n        applyLayout();\n      }\n    });\n\n    // history API → “locationchange”\n    const wrap = type => {\n      const orig = history[type];\n      return function() {\n        const rv = orig.apply(this, arguments);\n        window.dispatchEvent(new Event('locationchange'));\n        return rv;\n      };\n    };\n    history.pushState    = wrap('pushState');\n    history.replaceState = wrap('replaceState');\n    window.addEventListener('popstate', () => {\n      window.dispatchEvent(new Event('locationchange'));\n    });\n    window.addEventListener('locationchange', checkURL);\n  });\n</script>","logoFile":"","introFile":"IntroPage_PEACH.jpg","defaultEditorMode":"source","tabletLogoFile":"","mobileLogoFile":"","customFonts":["OTNeueMontreal-MediumSemiSqueezed:500:OTNeueMontreal-MediumSemiSqueezed:custom"],"disableRightClick":false,"logoHtml":"<img src=\"/pf-media/JodiPudge_HorizontalLogo_Black_RGB1.png\" style=\"width: 100%;\" />","contactInfo":"Jodi Pudge\n100-15 Adrian Avenue  Toronto, Ontario  CANADA  M6N 5G4\n 1 416 537 8227","globalMasterVersion":"16.0","globalBetaVersion":"16.1","accountName":"jodipudgetest","rsSslUri":"/pf-media","adminLockout":false,"redirects":[]}