Teact: Introduce setExtraStyles
This commit is contained in:
parent
4e87c56fb9
commit
392b2d53cb
@ -1,7 +1,9 @@
|
|||||||
import type { RefObject } from 'react';
|
import type { RefObject } from 'react';
|
||||||
import React, { useEffect, useLayoutEffect, useRef } from '../../lib/teact/teact';
|
import React, { useEffect, useLayoutEffect, useRef } from '../../lib/teact/teact';
|
||||||
import { addExtraClass, removeExtraClass, toggleExtraClass } from '../../lib/teact/teact-dom';
|
import {
|
||||||
import { requestMutation, requestForcedReflow } from '../../lib/fasterdom/fasterdom';
|
addExtraClass, removeExtraClass, setExtraStyles, toggleExtraClass,
|
||||||
|
} from '../../lib/teact/teact-dom';
|
||||||
|
import { requestForcedReflow, requestMutation } from '../../lib/fasterdom/fasterdom';
|
||||||
|
|
||||||
import { getGlobal } from '../../global';
|
import { getGlobal } from '../../global';
|
||||||
|
|
||||||
@ -146,8 +148,10 @@ function Transition({
|
|||||||
addExtraClass(activeChild, CLASSES.active);
|
addExtraClass(activeChild, CLASSES.active);
|
||||||
|
|
||||||
if (isSlideOptimized) {
|
if (isSlideOptimized) {
|
||||||
activeChild.style.transition = 'none';
|
setExtraStyles(activeChild, {
|
||||||
activeChild.style.transform = 'translate3d(0, 0, 0)';
|
transition: 'none',
|
||||||
|
transform: 'translate3d(0, 0, 0)',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,8 +237,8 @@ function Transition({
|
|||||||
|
|
||||||
if (shouldRestoreHeight) {
|
if (shouldRestoreHeight) {
|
||||||
if (activeElement) {
|
if (activeElement) {
|
||||||
activeElement.style.height = 'auto';
|
setExtraStyles(activeElement, { height: 'auto' });
|
||||||
container.style.height = `${clientHeight}px`;
|
setExtraStyles(container, { height: `${clientHeight}px` });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,9 +294,11 @@ function Transition({
|
|||||||
}
|
}
|
||||||
|
|
||||||
requestMutation(() => {
|
requestMutation(() => {
|
||||||
activeElement.style.height = 'auto';
|
setExtraStyles(activeElement, { height: 'auto' });
|
||||||
container.style.height = `${clientHeight}px`;
|
setExtraStyles(container, {
|
||||||
container.style.flexBasis = `${clientHeight}px`;
|
height: `${clientHeight}px`,
|
||||||
|
flexBasis: `${clientHeight}px`,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}, [shouldRestoreHeight, children]);
|
}, [shouldRestoreHeight, children]);
|
||||||
|
|
||||||
@ -347,15 +353,19 @@ function performSlideOptimized(
|
|||||||
toggleExtraClass(container, `Transition-${name}Backwards`, isBackwards);
|
toggleExtraClass(container, `Transition-${name}Backwards`, isBackwards);
|
||||||
|
|
||||||
if (fromSlide instanceof HTMLElement) {
|
if (fromSlide instanceof HTMLElement) {
|
||||||
fromSlide.style.transition = 'none';
|
|
||||||
fromSlide.style.transform = '';
|
|
||||||
removeExtraClass(fromSlide, CLASSES.active);
|
removeExtraClass(fromSlide, CLASSES.active);
|
||||||
|
setExtraStyles(fromSlide, {
|
||||||
|
transition: 'none',
|
||||||
|
transform: '',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toSlide instanceof HTMLElement) {
|
if (toSlide instanceof HTMLElement) {
|
||||||
toSlide.style.transition = 'none';
|
|
||||||
toSlide.style.transform = 'translate3d(0, 0, 0)';
|
|
||||||
addExtraClass(toSlide, CLASSES.active);
|
addExtraClass(toSlide, CLASSES.active);
|
||||||
|
setExtraStyles(toSlide, {
|
||||||
|
transition: 'none',
|
||||||
|
transform: 'translate3d(0, 0, 0)',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
@ -375,13 +385,17 @@ function performSlideOptimized(
|
|||||||
toggleExtraClass(container, `Transition-${name}Backwards`, isBackwards);
|
toggleExtraClass(container, `Transition-${name}Backwards`, isBackwards);
|
||||||
|
|
||||||
if (fromSlide instanceof HTMLElement) {
|
if (fromSlide instanceof HTMLElement) {
|
||||||
fromSlide.style.transition = 'none';
|
setExtraStyles(fromSlide, {
|
||||||
fromSlide.style.transform = 'translate3d(0, 0, 0)';
|
transition: 'none',
|
||||||
|
transform: 'translate3d(0, 0, 0)',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toSlide instanceof HTMLElement) {
|
if (toSlide instanceof HTMLElement) {
|
||||||
toSlide.style.transition = 'none';
|
setExtraStyles(toSlide, {
|
||||||
toSlide.style.transform = `translate3d(${isBackwards ? '-' : ''}100%, 0, 0)`;
|
transition: 'none',
|
||||||
|
transform: `translate3d(${isBackwards ? '-' : ''}100%, 0, 0)`,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
requestForcedReflow(() => {
|
requestForcedReflow(() => {
|
||||||
@ -391,15 +405,19 @@ function performSlideOptimized(
|
|||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
if (fromSlide instanceof HTMLElement) {
|
if (fromSlide instanceof HTMLElement) {
|
||||||
fromSlide.style.transition = '';
|
|
||||||
fromSlide.style.transform = `translate3d(${isBackwards ? '' : '-'}100%, 0, 0)`;
|
|
||||||
removeExtraClass(fromSlide, CLASSES.active);
|
removeExtraClass(fromSlide, CLASSES.active);
|
||||||
|
setExtraStyles(fromSlide, {
|
||||||
|
transition: '',
|
||||||
|
transform: `translate3d(${isBackwards ? '' : '-'}100%, 0, 0)`,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toSlide instanceof HTMLElement) {
|
if (toSlide instanceof HTMLElement) {
|
||||||
toSlide.style.transition = '';
|
|
||||||
toSlide.style.transform = 'translate3d(0, 0, 0)';
|
|
||||||
addExtraClass(toSlide, CLASSES.active);
|
addExtraClass(toSlide, CLASSES.active);
|
||||||
|
setExtraStyles(toSlide, {
|
||||||
|
transition: '',
|
||||||
|
transform: 'translate3d(0, 0, 0)',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@ -413,13 +431,15 @@ function performSlideOptimized(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fromSlide instanceof HTMLElement) {
|
if (fromSlide instanceof HTMLElement) {
|
||||||
fromSlide.style.transition = 'none';
|
setExtraStyles(fromSlide, {
|
||||||
fromSlide.style.transform = '';
|
transition: 'none',
|
||||||
|
transform: '',
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldRestoreHeight && clientHeight && toSlide instanceof HTMLElement) {
|
if (shouldRestoreHeight && clientHeight && toSlide instanceof HTMLElement) {
|
||||||
toSlide.style.height = 'auto';
|
setExtraStyles(toSlide, { height: 'auto' });
|
||||||
container.style.height = `${clientHeight}px`;
|
setExtraStyles(container, { height: `${clientHeight}px` });
|
||||||
}
|
}
|
||||||
|
|
||||||
onStop?.();
|
onStop?.();
|
||||||
|
|||||||
@ -46,6 +46,7 @@ const INDEX_KEY_PREFIX = '__indexKey#';
|
|||||||
|
|
||||||
const headsByElement = new WeakMap<Element, VirtualDomHead>();
|
const headsByElement = new WeakMap<Element, VirtualDomHead>();
|
||||||
const extraClasses = new WeakMap<Element, Set<string>>();
|
const extraClasses = new WeakMap<Element, Set<string>>();
|
||||||
|
const extraStyles = new WeakMap<Element, Record<string, string>>();
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||||
let DEBUG_virtualTreeSize = 1;
|
let DEBUG_virtualTreeSize = 1;
|
||||||
@ -669,7 +670,7 @@ function setAttribute(element: HTMLElement, key: string, value: any) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (key === 'style') {
|
} else if (key === 'style') {
|
||||||
element.style.cssText = value;
|
updateStyle(element, value);
|
||||||
} else if (key === 'dangerouslySetInnerHTML') {
|
} else if (key === 'dangerouslySetInnerHTML') {
|
||||||
// eslint-disable-next-line no-underscore-dangle
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
element.innerHTML = value.__html;
|
element.innerHTML = value.__html;
|
||||||
@ -688,7 +689,7 @@ function removeAttribute(element: HTMLElement, key: string, value: any) {
|
|||||||
} else if (key === 'value') {
|
} else if (key === 'value') {
|
||||||
(element as HTMLInputElement).value = '';
|
(element as HTMLInputElement).value = '';
|
||||||
} else if (key === 'style') {
|
} else if (key === 'style') {
|
||||||
element.style.cssText = '';
|
updateStyle(element, '');
|
||||||
} else if (key === 'dangerouslySetInnerHTML') {
|
} else if (key === 'dangerouslySetInnerHTML') {
|
||||||
element.innerHTML = '';
|
element.innerHTML = '';
|
||||||
} else if (key.startsWith('on')) {
|
} else if (key.startsWith('on')) {
|
||||||
@ -713,6 +714,15 @@ function updateClassName(element: HTMLElement, value: string) {
|
|||||||
element.className = extraArray.join(' ');
|
element.className = extraArray.join(' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateStyle(element: HTMLElement, value: string) {
|
||||||
|
element.style.cssText = value;
|
||||||
|
|
||||||
|
const extraObject = extraStyles.get(element);
|
||||||
|
if (extraObject) {
|
||||||
|
applyExtraStyles(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function addExtraClass(element: Element, className: string, forceSingle = false) {
|
export function addExtraClass(element: Element, className: string, forceSingle = false) {
|
||||||
if (!forceSingle) {
|
if (!forceSingle) {
|
||||||
const classNames = className.split(' ');
|
const classNames = className.split(' ');
|
||||||
@ -780,6 +790,28 @@ export function toggleExtraClass(element: Element, className: string, force?: bo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function setExtraStyles(element: HTMLElement, styles: Partial<CSSStyleDeclaration> & AnyLiteral) {
|
||||||
|
extraStyles.set(element, styles);
|
||||||
|
applyExtraStyles(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyExtraStyles(element: HTMLElement) {
|
||||||
|
const standardStyles = Object.entries(extraStyles.get(element)!).reduce<Record<string, string>>(
|
||||||
|
(acc, [prop, value]) => {
|
||||||
|
if (prop.startsWith('--')) {
|
||||||
|
element.style.setProperty(prop, value);
|
||||||
|
} else {
|
||||||
|
acc[prop] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
|
||||||
|
Object.assign(element.style, standardStyles);
|
||||||
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||||
function DEBUG_addToVirtualTreeSize($current: VirtualElementParent | VirtualDomHead) {
|
function DEBUG_addToVirtualTreeSize($current: VirtualElementParent | VirtualDomHead) {
|
||||||
DEBUG_virtualTreeSize += $current.children.length;
|
DEBUG_virtualTreeSize += $current.children.length;
|
||||||
|
|||||||
@ -745,7 +745,12 @@ function useEffectBase(
|
|||||||
};
|
};
|
||||||
|
|
||||||
function setupSignals() {
|
function setupSignals() {
|
||||||
const cleanups = dependencies?.filter(isSignal).map((signal) => signal.subscribe(() => {
|
const cleanups = dependencies?.filter(isSignal).map((signal, i) => signal.subscribe(() => {
|
||||||
|
if (debugKey) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(`[Teact] Effect "${debugKey}" caused by signal #${i} new value:`, signal());
|
||||||
|
}
|
||||||
|
|
||||||
byCursor[cursor].schedule();
|
byCursor[cursor].schedule();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user