398 lines
7.9 KiB
JavaScript
398 lines
7.9 KiB
JavaScript
import ctEvents from 'ct-events'
|
|
import {
|
|
shortenItemId,
|
|
getOriginalId,
|
|
} from '../panels-builder/placements/helpers'
|
|
|
|
export const getSkipRuleKeyword = (suffix = '') => {
|
|
return `CT_CSS_SKIP_RULE${suffix}`
|
|
}
|
|
|
|
export const assembleSelector = (selector) =>
|
|
Array.isArray(selector) ? selector.join(' ') : selector
|
|
|
|
export const mutateSelector = (args = {}) => {
|
|
args = {
|
|
selector: null,
|
|
// prefix | suffix | between | replace-last
|
|
operation: 'between',
|
|
to_add: '',
|
|
...args,
|
|
}
|
|
|
|
if (args.operation === 'between') {
|
|
let [first, ...rest] = args.selector
|
|
return [first, args.to_add, ...rest]
|
|
}
|
|
|
|
if (args.operation === 'el-prefix' && args.selector.length > 1) {
|
|
let [first, second, ...rest] = args.selector
|
|
|
|
return [first, `${args.to_add}${second}`, ...rest]
|
|
}
|
|
|
|
if (args.operation === 'el-suffix' && args.selector.length > 1) {
|
|
let [first, second, ...rest] = args.selector
|
|
return [first, `${second}${args.to_add}`, ...rest]
|
|
}
|
|
|
|
if (args.operation === 'container-suffix') {
|
|
let [first, ...rest] = args.selector
|
|
|
|
return [`${first}${args.to_add}`, ...rest]
|
|
}
|
|
|
|
if (args.operation === 'suffix') {
|
|
return [...args.selector, args.to_add]
|
|
}
|
|
|
|
if (args.operation === 'prefix') {
|
|
return [args.to_add, ...args.selector]
|
|
}
|
|
|
|
if (args.operation === 'replace-last') {
|
|
let last = args.selector.pop()
|
|
return [...args.selector, args.to_add]
|
|
}
|
|
|
|
return args.selector
|
|
}
|
|
|
|
export const getColumnSelectorFor = (args = {}) => {
|
|
args = {
|
|
itemId: null,
|
|
...args,
|
|
}
|
|
|
|
let result = getOriginalId(args.itemId)
|
|
|
|
if (getOriginalId(args.itemId) !== shortenItemId(args.itemId)) {
|
|
result = `${result}:${shortenItemId(args.itemId)}`
|
|
}
|
|
|
|
return `[data-column="${result}"]`
|
|
}
|
|
|
|
export const getRootSelectorFor = (args = {}) => {
|
|
args = {
|
|
// header | footer
|
|
panelType: 'header',
|
|
itemId: null,
|
|
fullItemId: null,
|
|
|
|
...args,
|
|
}
|
|
|
|
if (args.itemId && !args.fullItemId) {
|
|
args.fullItemId = args.itemId
|
|
}
|
|
|
|
let selector = ''
|
|
|
|
if (args.itemId) {
|
|
selector = `[data-id="${args.itemId}"]`
|
|
|
|
if (['middle-row', 'top-row', 'bottom-row'].indexOf(args.itemId) > -1) {
|
|
selector = `[data-row*="${args.itemId.replace('-row', '')}"]`
|
|
}
|
|
|
|
if (args.itemId === 'socials') {
|
|
selector = `${selector}.ct-${args.panelType}-socials`
|
|
}
|
|
|
|
if (args.itemId === 'offcanvas') {
|
|
selector = '#offcanvas'
|
|
}
|
|
}
|
|
|
|
let section = document.querySelector(
|
|
args.panelType === 'header' ? 'header#header' : 'footer.ct-footer'
|
|
)
|
|
|
|
let header_prefix = `[data-${args.panelType}*="${
|
|
section ? section.dataset.id || 'type-1' : 'type-1'
|
|
}"]`
|
|
|
|
if (
|
|
args.fullItemId &&
|
|
[
|
|
'middle-row',
|
|
'top-row',
|
|
'bottom-row',
|
|
'menu',
|
|
'menu-secondary',
|
|
'menu-tertiary',
|
|
'logo',
|
|
'language-switcher',
|
|
'button',
|
|
'text',
|
|
'search-input',
|
|
'contacts',
|
|
'widget-area-1',
|
|
'widget-area-2',
|
|
'widget-area-3',
|
|
'widget-area-4',
|
|
].indexOf(getOriginalId(args.fullItemId)) > -1
|
|
) {
|
|
if (args.panelType === 'header') {
|
|
header_prefix = `${header_prefix} .ct-header`
|
|
}
|
|
|
|
if (args.panelType === 'footer') {
|
|
header_prefix = `${header_prefix} .ct-footer`
|
|
}
|
|
}
|
|
|
|
if (!selector) {
|
|
return [header_prefix]
|
|
}
|
|
|
|
return [header_prefix, selector]
|
|
}
|
|
|
|
export const applyPrefixFor = (selector, prefix) => {
|
|
if (prefix && prefix.length > 0) {
|
|
return `[data-prefix="${prefix}"] ${selector}`
|
|
}
|
|
|
|
return selector
|
|
}
|
|
|
|
export const getPrefixFor = ({
|
|
allowed_prefixes = null,
|
|
default_prefix = null,
|
|
} = {}) => {
|
|
let actualPrefix = document.body.dataset.prefix
|
|
|
|
if (
|
|
allowed_prefixes &&
|
|
actualPrefix.indexOf('_archive') === -1 &&
|
|
allowed_prefixes.indexOf(actualPrefix) === -1
|
|
) {
|
|
actualPrefix = default_prefix
|
|
}
|
|
|
|
return actualPrefix
|
|
}
|
|
|
|
export const maybeInsertBefore = ({ el, selector, destination }) => {
|
|
if (destination.querySelector(selector)) {
|
|
destination.insertBefore(el, destination.querySelector(selector))
|
|
} else {
|
|
destination.appendChild(el)
|
|
}
|
|
}
|
|
|
|
export const withKeys = (keys, descriptor) =>
|
|
keys.reduce(
|
|
(result, currentKey) => ({
|
|
...result,
|
|
[currentKey]: descriptor,
|
|
}),
|
|
{}
|
|
)
|
|
|
|
export const setRatioFor = (args = {}) => {
|
|
args = {
|
|
ratio: false,
|
|
el: null,
|
|
|
|
setFullSize: false,
|
|
|
|
...args,
|
|
}
|
|
|
|
if (!args.el) {
|
|
return
|
|
}
|
|
|
|
if (!args.ratio) {
|
|
args.ratio = '4/3'
|
|
}
|
|
|
|
args.el.querySelectorAll('[width]').forEach((imgEl) => {
|
|
let thumb_ratio = args.ratio.split(
|
|
args.ratio.indexOf('/') > -1 ? '/' : ':'
|
|
)
|
|
|
|
if (args.ratio === 'original') {
|
|
thumb_ratio = [
|
|
imgEl.parentNode.dataset.w
|
|
? parseInt(imgEl.parentNode.dataset.w)
|
|
: imgEl.naturalWidth,
|
|
imgEl.parentNode.dataset.h
|
|
? parseInt(imgEl.parentNode.dataset.h)
|
|
: imgEl.naturalHeight,
|
|
]
|
|
}
|
|
|
|
imgEl.style.aspectRatio = `${thumb_ratio[0]} / ${thumb_ratio[1]}`
|
|
|
|
if (args.setFullSize) {
|
|
let fullSize = ''
|
|
|
|
if (imgEl.dataset.original) {
|
|
fullSize = imgEl.dataset.original
|
|
}
|
|
|
|
if (imgEl.srcset && !imgEl.dataset.original) {
|
|
const srcSetFullSize = imgEl.srcset
|
|
.split(',')
|
|
.reverse()[0]
|
|
.trim()
|
|
|
|
if (srcSetFullSize) {
|
|
fullSize = srcSetFullSize.split(' ')[0]
|
|
}
|
|
}
|
|
|
|
if (fullSize) {
|
|
imgEl.src = fullSize
|
|
|
|
imgEl.removeAttribute('srcset')
|
|
imgEl.removeAttribute('sizes')
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
export function changeTagName(node, name) {
|
|
var renamed = document.createElement(name)
|
|
|
|
;[...node.attributes].map(({ name, value }) => {
|
|
renamed.setAttribute(name, value)
|
|
})
|
|
|
|
while (node.firstChild) {
|
|
renamed.appendChild(node.firstChild)
|
|
}
|
|
|
|
return node.parentNode.replaceChild(renamed, node)
|
|
}
|
|
|
|
export const getOptionFor = (key, prefix = '') => {
|
|
const id = `${prefix}${prefix.length > 0 ? '_' : ''}${key}`
|
|
|
|
if (wp.customize(id)) {
|
|
return wp.customize(id)()
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
export const watchOptionsWithPrefix = (args = {}) => {
|
|
const {
|
|
getPrefix = getPrefixFor,
|
|
getOptionsForPrefix = ({ prefix }) => [],
|
|
render = () => {},
|
|
events = [],
|
|
} = args
|
|
|
|
let prefix = getPrefix()
|
|
|
|
events.map((evt) => ctEvents.on(evt, () => render({ prefix })))
|
|
|
|
getOptionsForPrefix({ prefix }).map((id) =>
|
|
wp.customize(id, (val) => val.bind((to) => render({ prefix, id })))
|
|
)
|
|
}
|
|
|
|
export const handleResponsiveSwitch = ({
|
|
selector,
|
|
variable = 'visibility',
|
|
on = 'block',
|
|
off = 'none',
|
|
}) => ({
|
|
selector,
|
|
variable,
|
|
responsive: true,
|
|
extractValue: ({ mobile, tablet, desktop }) => ({
|
|
mobile: mobile ? on : off,
|
|
tablet: tablet ? on : off,
|
|
desktop: desktop ? on : off,
|
|
}),
|
|
})
|
|
|
|
export const responsiveClassesFor = (data, el) => {
|
|
el.classList.remove('ct-hidden-sm', 'ct-hidden-md', 'ct-hidden-lg')
|
|
|
|
if (typeof data === 'string') {
|
|
if (!wp.customize(data)) return
|
|
|
|
data = wp.customize(data)() || {
|
|
mobile: false,
|
|
tablet: true,
|
|
desktop: true,
|
|
}
|
|
}
|
|
|
|
if (data === true || typeof data === 'undefined') {
|
|
return
|
|
}
|
|
|
|
if (!data.mobile) {
|
|
el.classList.add('ct-hidden-sm')
|
|
}
|
|
|
|
if (!data.tablet) {
|
|
el.classList.add('ct-hidden-md')
|
|
}
|
|
|
|
if (!data.desktop) {
|
|
el.classList.add('ct-hidden-lg')
|
|
}
|
|
}
|
|
|
|
export const replaceFirstTextNode = (el, newText) => {
|
|
let textNode = [...el.childNodes].find(
|
|
(elm) => elm.nodeType != 1 && elm.textContent.trim().length !== 0
|
|
)
|
|
|
|
if (!textNode) {
|
|
el.insertAdjacentText('afterbegin', newText)
|
|
return
|
|
}
|
|
|
|
textNode.textContent = `${newText}${String.fromCharCode(160)}`
|
|
}
|
|
|
|
export const disableTransitionsStart = (el) => {
|
|
Array.from(el).map((el) => {
|
|
el.classList.add('ct-disable-transitions')
|
|
})
|
|
}
|
|
|
|
export const disableTransitionsEnd = (el) => {
|
|
setTimeout(() => {
|
|
Array.from(el).map((el) => {
|
|
el.classList.remove('ct-disable-transitions')
|
|
})
|
|
}, 50)
|
|
}
|
|
|
|
export const mapValue = (args = {}) => {
|
|
args = {
|
|
value: {},
|
|
map: {},
|
|
...args,
|
|
}
|
|
|
|
if (args.value.desktop && args.map[args.value.desktop]) {
|
|
args.value.desktop = args.map[args.value.desktop]
|
|
}
|
|
|
|
if (args.value.tablet && args.map[args.value.tablet]) {
|
|
args.value.tablet = args.map[args.value.tablet]
|
|
}
|
|
|
|
if (args.value.mobile && args.map[args.value.mobile]) {
|
|
args.value.mobile = args.map[args.value.mobile]
|
|
}
|
|
|
|
if (args.map[args.value]) {
|
|
return args.map[args.value]
|
|
}
|
|
|
|
return args.value
|
|
}
|