File: //var/www/drakkar_site/wp-content/themes/blocksy/static/js/customizer/sync/variables/typography.js
import WebFontLoader from 'webfontloader'
const withPrefix = (value, prefix = '') => {
if (prefix.trim() === '') {
return value
}
return value.replace('theme-', `theme-${prefix}-`)
}
const getWeightFor = ({ variation }) => {
if (variation === 'Default') {
return 'CT_CSS_SKIP_RULE'
}
return parseInt(variation[1], 10) * 100
}
const getStyleFor = ({ variation }) => {
if (variation === 'Default') {
return 'CT_CSS_SKIP_RULE'
}
return variation[0] === 'i' ? 'italic' : 'normal'
}
let loadedFonts = {}
const systemFonts = [
'System Default',
'Arial',
'Verdana',
'Trebuchet',
'Georgia',
'Times New Roman',
'Palatino',
'Helvetica',
'Myriad Pro',
'Lucida',
'Gill Sans',
'Impact',
'Serif',
'monospace',
]
const loadGoogleFonts = (font_family, variation) => {
if (systemFonts.indexOf(font_family) > -1) {
return
}
if (font_family.indexOf('ct_font_') === 0) {
return
}
if (font_family.indexOf('ct_typekit_') === 0) {
return
}
if (font_family === 'CT_CSS_SKIP_RULE') {
return
}
if (font_family === 'Default') {
return
}
if (font_family.indexOf('apple-system') > -1) {
return
}
let italVars = []
let wghtVars = []
if (loadedFonts[font_family]) {
if (loadedFonts[font_family].indexOf(variation) > -1) return
loadedFonts[font_family] = [...loadedFonts[font_family], variation]
} else {
loadedFonts[font_family] = [variation]
}
for (let variation of loadedFonts[font_family]) {
let varToPush = parseInt(variation[1]) * 100
varToPush += variation[0] === 'i' ? 'i' : ''
if (variation[0] === 'i') {
italVars.push(parseInt(variation[1]) * 100)
} else {
wghtVars.push(parseInt(variation[1]) * 100)
}
}
italVars.sort((a, b) => a - b)
wghtVars.sort((a, b) => a - b)
let axisTagList = []
if (italVars.length > 0) {
axisTagList.push('ital')
}
axisTagList.push('wght')
let toPush = axisTagList.join(',') + '@'
let allVars = []
for (let wghtVar of wghtVars) {
if (axisTagList.length > 1) {
allVars.push('0,' + wghtVar)
} else {
allVars.push(wghtVar)
}
}
for (let italVar of italVars) {
allVars.push('1,' + italVar)
}
toPush += allVars.join(';')
WebFontLoader.load({
google: {
api: 'https://fonts.googleapis.com/css2',
families: [`${font_family}:${toPush}`],
},
classes: false,
text: 'abcdefghijklmnopqrstuvwxyz',
})
}
export const typographyOption = ({
id,
selector,
prefix = '',
extractValue = (v) => v,
}) => ({
[id]: [
{
variable: withPrefix('theme-font-family', prefix),
selector,
extractValue: (value) => {
value = extractValue(value)
if (value.family === 'Default') {
return 'CT_CSS_SKIP_RULE'
}
if (value.family === 'System Default') {
return 'var(--theme-font-stack-default)'
}
if (systemFonts.indexOf(value.family) > -1) {
return value.family
}
if (value.family.indexOf(' ') > -1) {
return `'${value.family}'`.replace('ct_typekit_', '')
}
return value.family.replace('ct_typekit_', '')
},
whenDone: (extractedValue, value) => {
if (!extractedValue) {
return
}
let { variation } = extractValue(value)
loadGoogleFonts(extractedValue.replace(/\'/g, ''), variation)
},
},
{
variable: withPrefix('theme-font-weight', prefix),
selector,
extractValue: (value) => {
value = extractValue(value)
return getWeightFor(value)
},
whenDone: (extractedValue, value) => {
let { family, variation } = extractValue(value)
loadGoogleFonts(family, variation)
},
},
{
variable: withPrefix('theme-font-style', prefix),
selector,
extractValue: (value) => {
value = extractValue(value)
return getStyleFor(value)
},
whenDone: (extractedValue, value) => {
let { family, variation } = extractValue(value)
loadGoogleFonts(family, variation)
},
},
{
variable: withPrefix('theme-text-transform', prefix),
selector,
extractValue: (value) => {
value = extractValue(value)
return value['text-transform']
},
},
{
variable: withPrefix('theme-text-decoration', prefix),
selector,
extractValue: (value) => {
value = extractValue(value)
return value['text-decoration']
},
},
{
variable: withPrefix('theme-font-size', prefix),
selector,
unit: '',
responsive: true,
extractValue: (value) => {
value = extractValue(value)
return value.size
},
},
{
variable: withPrefix('theme-line-height', prefix),
selector,
unit: '',
responsive: true,
extractValue: (value) => {
value = extractValue(value)
return value['line-height']
},
},
{
variable: withPrefix('theme-letter-spacing', prefix),
selector,
unit: '',
responsive: true,
extractValue: (value) => {
value = extractValue(value)
return value['letter-spacing']
},
},
],
})
export const getTypographyVariablesFor = () => ({
...typographyOption({
id: 'rootTypography',
selector: ':root',
}),
...typographyOption({
id: 'h1Typography',
selector: 'h1',
}),
...typographyOption({
id: 'h2Typography',
selector: 'h2',
}),
...typographyOption({
id: 'h3Typography',
selector: 'h3',
}),
...typographyOption({
id: 'h4Typography',
selector: 'h4',
}),
...typographyOption({
id: 'h5Typography',
selector: 'h5',
}),
...typographyOption({
id: 'h6Typography',
selector: 'h6',
}),
...typographyOption({
id: 'buttons',
selector: ':root',
prefix: 'button',
}),
...typographyOption({
id: 'quote',
selector: '.wp-block-quote',
}),
...typographyOption({
id: 'pullquote',
selector: '.wp-block-pullquote',
}),
...typographyOption({
id: 'pre',
selector: 'pre, code, samp, kbd',
}),
...typographyOption({
id: 'figcaption',
selector: '.entry-content figcaption',
}),
...typographyOption({
id: 'sidebarWidgetsTitleFont',
selector: '.ct-sidebar .widget-title',
}),
...typographyOption({
id: 'sidebarWidgetsFont',
selector: '.ct-sidebar .ct-widget > *:not(.widget-title)',
}),
...typographyOption({
id: 'quickViewProductTitleFont',
selector: '.ct-quick-view-card .product_title',
}),
...typographyOption({
id: 'quickViewProductPriceFont',
selector: '.ct-quick-view-card .entry-summary .price',
}),
...typographyOption({
id: 'breadcrumbsFont',
selector: '.ct-breadcrumbs',
}),
...typographyOption({
id: 'shop_results_count_font',
selector: '.woo-listing-top .woocommerce-result-count',
}),
})