window.Codex = function() { let overrides = JSON.parse(localStorage.getItem('codex-overrides')) || {} let init = function() { if(!window.codex) { window.codex = { api: 'https://iamyogi.codexfit.com', translations: 'https://iamyogi.codexfit.com/api/v1/customer/translations', stripe_key: 'pk_live_51R4jGhS8Tdzlj6vEqXd9gVv2IsgMNUXa2EClkY8vynqAryZb5UmhrYJqdnVczzMyMp32mR21FbeuVtlvyihRIayb007uxMvRKr', timezone: 'Europe/London', components: {}, stageIds: ['codex-app'], locale: 'en-GB', currency: 'GBP', currencyDecimals: 2, app_id: 'iamyogi', delimiters: ['{{','}}'], routerConfig: { mode: 'hash' }, scriptUrl: 'https://codexfit-api-assets.s3.amazonaws.com/main-v4/latest/main.js', styleUrl: 'https://api-v3.codexfit.com/styles/all.css', 'auto_configure': { modals: { 'codex-cart': { modalProps: { 'v-slot': '{open, close}', 'x-position': 'right', 'y-position': 'bottom', }, props: { 'v-on:updated': 'open', 'v-on:open': 'open', 'v-on:close': 'close', } }, 'codex-login': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, }, props: { 'v-on:close': 'close' } }, 'codex-register': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, }, props: { 'v-on:close': 'close' } }, 'codex-password-recover': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, }, props: { 'v-on:close': 'close' } }, 'codex-password-reset': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, }, props: { 'v-on:close': 'close' } }, 'codex-verify-sms': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, ':show-close-button': false }, props: { 'v-on:close': 'close' } }, 'codex-waitlist-confirmation': { modalProps: { 'v-slot': '{close, open}', ':delay-close': 3000 }, props: { 'v-on:close': 'close', 'v-on:open': 'open' } }, 'codex-survey': { modalProps: { 'v-slot': '{close}', }, props: { 'v-on:close': 'close', } } } }, registration_fields: {"first_name":{"type":"text","group":"","handle":"first_name","title":"","required":true,"placeholder":"First Name","validation":"","label_translation":"register_fields.first_name","placeholder_translation":"register_fields.first_name_placeholder","columnspan":""},"last_name":{"type":"text","group":"","handle":"last_name","title":"","required":true,"placeholder":"Last Name","validation":"","label_translation":"register_fields.last_name","placeholder_translation":"register_fields.last_name_placeholder","columnspan":""},"email":{"type":"email","group":"","handle":"email","title":"","required":true,"placeholder":"Email","validation":"","label_translation":"register_fields.email","placeholder_translation":"register_fields.email_placeholder","columnspan":""},"password":{"type":"password","group":"","handle":"password","title":"","required":true,"placeholder":"Password","validation":"","label_translation":"register_fields.password","placeholder_translation":"register_fields.password_placeholder","columnspan":""},"password_confirmation":{"type":"password","group":"","handle":"password_confirmation","title":"","required":true,"placeholder":"Confirm password","validation":"","label_translation":"register_fields.password_confirmation","placeholder_translation":"register_fields.password_confirmation_placeholder","columnspan":""},"telephone":{"type":"telephone","group":"","handle":"telephone","title":"","required":true,"placeholder":"Mobile number","validation":"","label_translation":"register_fields.telephone","placeholder_translation":"register_fields.telephone_placeholder","columnspan":""},"gender":{"type":"select","group":"","handle":"gender","title":"","required":true,"placeholder":"","validation":"","label_translation":"register_fields.gender","placeholder_translation":"register_fields.gender_placeholder","options":[{"value":"male","displayValue":"register_fields.gender_option.male"},{"value":"female","displayValue":"register_fields.gender_option.female"},{"value":"prefer_not_to_say","displayValue":"register_fields.gender_option.prefer_not_to_say"}],"columnspan":""},"dob":{"type":"date","group":"","handle":"dob","title":"","required":false,"placeholder":"Enter your date of birth","validation":"","label_translation":"register_fields.dob","placeholder_translation":"register_fields.dob_placeholder","columnspan":""},"opt_in_email":{"type":"checkbox","group":"","handle":"opt_in_email","title":"","required":false,"placeholder":"","validation":"","label_translation":"register_fields.opt_in_email","placeholder_translation":"register_fields.opt_in_email_placeholder","default":true,"inverted":false,"columnspan":"1"},"policy_health-waiver":{"type":"policy","group":"metafields","handle":"policy_health-waiver","title":"","required":true,"placeholder":"","validation":"","label_translation":"register_fields.policy_health-waiver","placeholder_translation":"register_fields.policy_health-waiver_placeholder","policy":{"id":1,"title":"Health Waiver","handle":"health-waiver","content":"
These terms and conditions are really important for you to read and understand prior to acceptance.<\/p>
I wish to participate in yoga practice with I AM YOGI.<\/p>
I agree to adhere to the following safety rules:
i. Ensure that any jewellery that may cause injury is removed.
ii. You are advised not to have mobile phones or keys in your pockets whilst participating, as these may cause injury.
iii. You should not consume food or use chewing gum during yoga practice.
iv. Personal photography or video recording is not permitted during yoga practice. I AM YOGI may capture photos or video for promotional purposes in a respectful and non-intrusive manner.
v. Be aware of other participants to ensure adequate spacing.
vi. You should not participate in yoga practice whilst under the influence of alcohol or drugs.<\/p>
Photography and Video Consent
From time to time, photos or videos may be taken during classes, events, or within the studio for promotional and marketing purposes.<\/p>
By attending, you acknowledge that you may be included in such content. These images or videos may be used on our website, social media, or other marketing materials by I AM YOGI.<\/p>
If you would prefer not to be included, please inform a member of the team prior to the start of the session, and we will always respect your wishes.<\/p>
In agreeing to this waiver, I accept and assume all of the risks associated with the activities offered. I confirm that I choose to participate voluntarily and with full awareness of these risks.<\/strong><\/p>","requires_consent":1,"metafields":null,"created_at":"2026-03-25T16:01:15.000000Z","updated_at":"2026-03-25T16:01:15.000000Z","deleted_at":null},"default":false,"use_policy_checkbox":true,"columnspan":"1"}}, registration_fields_layout: 1, update_fields: {"first_name":{"type":"text","group":"","handle":"first_name","title":"","required":true,"placeholder":"First Name","validation":"","label_translation":"update_fields.first_name","placeholder_translation":"update_fields.first_name_placeholder","columnspan":""},"last_name":{"type":"text","group":"","handle":"last_name","title":"","required":true,"placeholder":"Last Name","validation":"","label_translation":"update_fields.last_name","placeholder_translation":"update_fields.last_name_placeholder","columnspan":""},"email":{"type":"email","group":"","handle":"email","title":"","required":true,"placeholder":"Email","validation":"","label_translation":"update_fields.email","placeholder_translation":"update_fields.email_placeholder","columnspan":""},"username":{"type":"text","group":"","handle":"username","title":"","required":false,"placeholder":"Username","validation":"","label_translation":"update_fields.username","placeholder_translation":"update_fields.username_placeholder","columnspan":""},"password":{"type":"password","group":"","handle":"password","title":"","required":true,"placeholder":"Password","validation":"","label_translation":"update_fields.password","placeholder_translation":"update_fields.password_placeholder","columnspan":""},"password_confirmation":{"type":"password","group":"","handle":"password_confirmation","title":"","required":true,"placeholder":"Confirm password Placeholder","validation":"","label_translation":"update_fields.password_confirmation","placeholder_translation":"update_fields.password_confirmation_placeholder","columnspan":""},"dob":{"type":"date","group":"","handle":"dob","title":"","required":false,"placeholder":"Enter your date of birth","validation":"","label_translation":"update_fields.dob","placeholder_translation":"update_fields.dob_placeholder","columnspan":""},"telephone":{"type":"telephone","group":"","handle":"telephone","title":"","required":true,"placeholder":"Mobile number","validation":"","label_translation":"update_fields.telephone","placeholder_translation":"update_fields.telephone_placeholder","columnspan":""},"opt_in_email":{"type":"checkbox","group":"opt_ins","handle":"opt_in_email","title":"","required":false,"placeholder":"","validation":"","label_translation":"update_fields.opt_in_email","placeholder_translation":"update_fields.opt_in_email_placeholder","default":false,"inverted":false,"columnspan":""}}, update_fields_layout: 2, urls: {"buy_url":"https:\/\/www.iamyogi.co.uk\/pages\/plans","event_url":"https:\/\/www.iamyogi.co.uk\/pages\/event","account_url":"https:\/\/www.iamyogi.co.uk\/pages\/account","booking_url":"https:\/\/www.iamyogi.co.uk\/pages\/timetable","website_url":"https:\/\/www.iamyogi.co.uk\/","instructor_url":"https:\/\/www.iamyogi.co.uk\/pages\/instructor","instructors_url":"https:\/\/www.iamyogi.co.uk\/pages\/instructors"} } Object.keys(overrides).map(x => { window.codex[x] = overrides[x] }) var observer = new MutationObserver(function() { if (document.body) { if(window.codex.translations) { let translations = document.createElement("script") translations.type = "text/javascript" translations.src = window.codex.translations translations.addEventListener('load', function() { console.log('%cCodex |%c Translations loaded', 'font-weight: bold', 'font-weight: normal') document.dispatchEvent(new Event('codex-initialise')) }) document.head.appendChild(translations) console.log('%cCodex |%c Added translations', 'font-weight: bold', 'font-weight: normal') } if(window.codex.scriptUrl) { loadScript = function() { let cs = document.createElement("script") cs.type = window.codex.scriptType ?? "text/javascript" cs.src = window.codex.scriptUrl cs.module = cs.defer = true if(window.codex.momentLocaleUrl) { cs.addEventListener("load", function() { let mls = document.createElement("script") mls.type = "text/javascript" mls.src = window.codex.momentLocaleUrl mls.defer = true document.body.appendChild(mls) console.log('%cCodex |%c Added moment locale script', 'font-weight: bold', 'font-weight: normal') }) } document.body.appendChild(cs) console.log('%cCodex |%c Added app script', 'font-weight: bold', 'font-weight: normal') } if(document.readyState === "complete") { loadScript() } else { document.addEventListener("DOMContentLoaded", loadScript) } } if(window.codex.styleUrl) { let css = document.createElement("link") css.media = "all" css.type = "text/css" css.rel = "stylesheet" css.href = window.codex.styleUrl document.head.appendChild(css) console.log('%cCodex |%c Added default styles', 'font-weight: bold', 'font-weight: normal') } if(window.codex?.auto_configure?.modals) { // Create a single container for all modals const modalContainer = document.createElement("div") modalContainer.id = "codex-modal-container" modalContainer.dataset.codex = "" // Create modals within the single container Object.entries(window.codex.auto_configure.modals).forEach(([component, attrs]) => { const modal = document.createElement("codex-modal") modal.setAttribute('modal-name', component) Object.entries(attrs.modalProps ?? {}).forEach(([key, value]) => { modal.setAttribute(key, value) }) const vueComponent = document.createElement(component) Object.entries(attrs.props ?? {}).forEach(([key, value]) => { vueComponent.setAttribute(key, value) }) modal.appendChild(vueComponent) modalContainer.appendChild(modal) }) // Append the single container to body instead of head document.body.appendChild(modalContainer) document.addEventListener("click", (event) => { if(event.target?.dataset.codexModalOpen) { event.stopPropagation() document.dispatchEvent(new Event('codex.modal.open.' + event.target.dataset.codexModalOpen)) } if(event.target?.dataset.codexModalClose) { event.stopPropagation() document.dispatchEvent(new Event('codex.modal.close.' + event.target.dataset.codexModalClose)) } if(event.target?.dataset.codexModalToggle) { event.stopPropagation() document.dispatchEvent(new Event('codex.modal.toggle.' + event.target.dataset.codexModalToggle)) } }) console.log('%cCodex |%c Added default modals', 'font-weight: bold', 'font-weight: normal') } observer.disconnect(); } }) observer.observe(document.documentElement, {childList: true}); console.log(`%cCodex | %cConfiguring...`, 'font-weight: bold', 'font-weight: normal' ) if(localStorage.getItem('codex-overrides')) { console.log('%cCodex | %cWarning! Using custom overrides %o', 'font-weight: bold', 'color: rgb(217,31,38)', overrides) // Object.keys(overrides).map(x => { // console.log('%c ' + x + ': ' + overrides[x], 'display: block; color: red') // }) } // if(localStorage.getItem('codex-script-url')) { // console.log(`%cWarning: Using custom script URL: ` + localStorage.getItem('codex-script-url'), 'display: block; font-size: 16px;color: red);') // } } } let addStage = function(id) { window.codex.stageIds.push(id) } let store = function(key, value) { window.codex[key] = value overrides[key] = value localStorage.setItem('codex-overrides', JSON.stringify(overrides)) } let set = function(key, value) { window.codex[key] = value } let unset = function(key) { delete window.codex[key] delete overrides[key] localStorage.setItem('codex-overrides', JSON.stringify(overrides)) } return { addStage, store, set, unset, init, } } Codex().init();