98 lines
1.9 KiB
JavaScript
98 lines
1.9 KiB
JavaScript
import {
|
|
getRowInitialHeight,
|
|
getRowStickyHeight,
|
|
computeLinearScale,
|
|
clamp,
|
|
} from './shrink-utils'
|
|
|
|
let logoShrinkCache = null
|
|
|
|
export const clearLogoShrinkCache = () => {
|
|
logoShrinkCache = null
|
|
}
|
|
|
|
const getLogoShrinkData = ({ logo, row }) => {
|
|
if (logoShrinkCache) {
|
|
return logoShrinkCache
|
|
}
|
|
|
|
let initialHeight = parseFloat(
|
|
getComputedStyle(logo).getPropertyValue('--logo-max-height') || 50
|
|
)
|
|
|
|
const stickyShrink = parseFloat(
|
|
getComputedStyle(logo)
|
|
.getPropertyValue('--logo-sticky-shrink')
|
|
.toString()
|
|
.replace(',', '.') || 1
|
|
)
|
|
|
|
let rowInitialHeight = getRowInitialHeight(row)
|
|
let rowStickyHeight = getRowStickyHeight(row)
|
|
|
|
logoShrinkCache = {
|
|
initialHeight,
|
|
stickyShrink,
|
|
rowInitialHeight,
|
|
rowStickyHeight,
|
|
}
|
|
|
|
return logoShrinkCache
|
|
}
|
|
|
|
export const shrinkHandleLogo = ({ stickyContainer, startPosition }) => {
|
|
;[...stickyContainer.querySelectorAll('[data-row*="middle"]')].map(
|
|
(row) => {
|
|
if (!row.querySelector('[data-id="logo"] .site-logo-container')) {
|
|
return
|
|
}
|
|
|
|
const logo = row.querySelector(
|
|
'[data-id="logo"] .site-logo-container'
|
|
)
|
|
|
|
let {
|
|
initialHeight,
|
|
stickyShrink,
|
|
rowInitialHeight,
|
|
rowStickyHeight,
|
|
} = getLogoShrinkData({ logo, row })
|
|
|
|
const stickyHeight = initialHeight * stickyShrink
|
|
|
|
if (stickyShrink === 1) {
|
|
return
|
|
}
|
|
|
|
logo.style.setProperty(
|
|
'--logo-shrink-height',
|
|
`${
|
|
computeLinearScale(
|
|
[
|
|
startPosition,
|
|
startPosition +
|
|
Math.abs(
|
|
rowInitialHeight === rowStickyHeight
|
|
? initialHeight - stickyHeight
|
|
: rowInitialHeight - rowStickyHeight
|
|
),
|
|
],
|
|
[1, stickyShrink],
|
|
clamp(
|
|
startPosition,
|
|
startPosition +
|
|
Math.abs(
|
|
rowInitialHeight === rowStickyHeight
|
|
? initialHeight - stickyHeight
|
|
: rowInitialHeight - rowStickyHeight
|
|
),
|
|
|
|
scrollY
|
|
)
|
|
) * initialHeight
|
|
}px`
|
|
)
|
|
}
|
|
)
|
|
}
|