import ctEvents from 'ct-events' import { updateAndSaveEl } from '../../../../static/js/frontend/header/render-loop' import { responsiveClassesFor } from '../../../../static/js/customizer/sync/helpers' import { getRootSelectorFor, assembleSelector, mutateSelector, } from '../../../../static/js/customizer/sync/helpers' const svgs = { 'type-1': '', 'type-2': '', 'type-3': '', } ctEvents.on( 'ct:header:sync:collect-variable-descriptors', (variableDescriptors) => { variableDescriptors['cart'] = ({ itemId }) => ({ cartIconSize: { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '.ct-icon-container', }) ), variable: 'icon-size', responsive: true, unit: 'px', }, cartDropdownTopOffset: { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '.ct-cart-content', }) ), variable: 'dropdownTopOffset', unit: 'px', }, cartFontColor: [ { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '.ct-cart-content', }) ), variable: 'linkInitialColor', type: 'color:default', responsive: true, }, { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '.ct-cart-content', }) ), variable: 'linkHoverColor', type: 'color:hover', responsive: true, }, ], cartDropDownBackground: { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '.ct-cart-content', }) ), variable: 'backgroundColor', type: 'color:default', responsive: true, }, headerCartMargin: { selector: assembleSelector(getRootSelectorFor({ itemId })), type: 'spacing', variable: 'margin', responsive: true, important: true, }, // default state cartHeaderIconColor: [ { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '> a', }) ), variable: 'linkInitialColor', type: 'color:default', responsive: true, }, { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '> a', }) ), variable: 'linkHoverColor', type: 'color:hover', responsive: true, }, ], cartBadgeColor: [ { selector: assembleSelector(getRootSelectorFor({ itemId })), variable: 'cartBadgeBackground', type: 'color:background', responsive: true, }, { selector: assembleSelector(getRootSelectorFor({ itemId })), variable: 'cartBadgeText', type: 'color:text', responsive: true, }, ], // transparent state transparentCartHeaderIconColor: [ { selector: assembleSelector( mutateSelector({ selector: mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '> a', }), operation: 'between', to_add: '[data-transparent-row="yes"]', }) ), variable: 'linkInitialColor', type: 'color:default', responsive: true, }, { selector: assembleSelector( mutateSelector({ selector: mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '> a', }), operation: 'between', to_add: '[data-transparent-row="yes"]', }) ), variable: 'linkHoverColor', type: 'color:hover', responsive: true, }, ], transparentCartBadgeColor: [ { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'between', to_add: '[data-transparent-row="yes"]', }) ), variable: 'cartBadgeBackground', type: 'color:background', responsive: true, }, { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'between', to_add: '[data-transparent-row="yes"]', }) ), variable: 'cartBadgeText', type: 'color:text', responsive: true, }, ], // sticky state stickyCartHeaderIconColor: [ { selector: assembleSelector( mutateSelector({ selector: mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '> a', }), operation: 'between', to_add: '[data-sticky*="yes"]', }) ), variable: 'linkInitialColor', type: 'color:default', responsive: true, }, { selector: assembleSelector( mutateSelector({ selector: mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'suffix', to_add: '> a', }), operation: 'between', to_add: '[data-sticky*="yes"]', }) ), variable: 'linkHoverColor', type: 'color:hover', responsive: true, }, ], stickyCartBadgeColor: [ { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'between', to_add: '[data-sticky*="yes"]', }) ), variable: 'cartBadgeBackground', type: 'color:background', responsive: true, }, { selector: assembleSelector( mutateSelector({ selector: getRootSelectorFor({ itemId }), operation: 'between', to_add: '[data-sticky*="yes"]', }) ), variable: 'cartBadgeText', type: 'color:text', responsive: true, }, ], }) } ) ctEvents.on('ct:header:sync:item:cart', ({ optionId, optionValue, values }) => { const selector = '[data-id="cart"]' if (optionId === 'header_cart_visibility') { updateAndSaveEl(selector, (el) => responsiveClassesFor({ ...optionValue, desktop: true }, el) ) } if (optionId === 'has_cart_subtotal') { updateAndSaveEl(selector, (el) => { ;[...el.querySelectorAll('.ct-cart-total')].map((el) => el.remove()) if (optionValue === 'yes') { const span = document.createElement('span') span.innerHTML = el.dataset.subtotal span.classList.add('ct-cart-total') el.querySelector('a').prepend(span) } }) } if (optionId === 'has_cart_badge') { updateAndSaveEl(selector, (el) => { el.firstElementChild.removeAttribute('data-skip-badge') if (optionValue === 'yes') return el.firstElementChild.dataset.skipBadge = '' }) } if (optionId === 'mini_cart_type') { updateAndSaveEl(selector, (el) => { el.querySelector('a > i').innerHTML = svgs[optionValue] }) } })