first commit
This commit is contained in:
42
node_modules/framer-motion/dist/es/render/html/HTMLVisualElement.mjs
generated
vendored
Normal file
42
node_modules/framer-motion/dist/es/render/html/HTMLVisualElement.mjs
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
import { transformProps, defaultTransformValue, readTransformValue, isCSSVariableName } from 'motion-dom';
|
||||
import { measureViewportBox } from '../../projection/utils/measure.mjs';
|
||||
import { DOMVisualElement } from '../dom/DOMVisualElement.mjs';
|
||||
import { buildHTMLStyles } from './utils/build-styles.mjs';
|
||||
import { renderHTML } from './utils/render.mjs';
|
||||
import { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';
|
||||
|
||||
function getComputedStyle(element) {
|
||||
return window.getComputedStyle(element);
|
||||
}
|
||||
class HTMLVisualElement extends DOMVisualElement {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.type = "html";
|
||||
this.renderInstance = renderHTML;
|
||||
}
|
||||
readValueFromInstance(instance, key) {
|
||||
if (transformProps.has(key)) {
|
||||
return this.projection?.isProjecting
|
||||
? defaultTransformValue(key)
|
||||
: readTransformValue(instance, key);
|
||||
}
|
||||
else {
|
||||
const computedStyle = getComputedStyle(instance);
|
||||
const value = (isCSSVariableName(key)
|
||||
? computedStyle.getPropertyValue(key)
|
||||
: computedStyle[key]) || 0;
|
||||
return typeof value === "string" ? value.trim() : value;
|
||||
}
|
||||
}
|
||||
measureInstanceViewportBox(instance, { transformPagePoint }) {
|
||||
return measureViewportBox(instance, transformPagePoint);
|
||||
}
|
||||
build(renderState, latestValues, props) {
|
||||
buildHTMLStyles(renderState, latestValues, props.transformTemplate);
|
||||
}
|
||||
scrapeMotionValuesFromProps(props, prevProps, visualElement) {
|
||||
return scrapeMotionValuesFromProps(props, prevProps, visualElement);
|
||||
}
|
||||
}
|
||||
|
||||
export { HTMLVisualElement, getComputedStyle };
|
||||
11
node_modules/framer-motion/dist/es/render/html/use-html-visual-state.mjs
generated
vendored
Normal file
11
node_modules/framer-motion/dist/es/render/html/use-html-visual-state.mjs
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
import { makeUseVisualState } from '../../motion/utils/use-visual-state.mjs';
|
||||
import { createHtmlRenderState } from './utils/create-render-state.mjs';
|
||||
import { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';
|
||||
|
||||
const useHTMLVisualState = /*@__PURE__*/ makeUseVisualState({
|
||||
scrapeMotionValuesFromProps,
|
||||
createRenderState: createHtmlRenderState,
|
||||
});
|
||||
|
||||
export { useHTMLVisualState };
|
||||
58
node_modules/framer-motion/dist/es/render/html/use-props.mjs
generated
vendored
Normal file
58
node_modules/framer-motion/dist/es/render/html/use-props.mjs
generated
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
"use client";
|
||||
import { isMotionValue } from 'motion-dom';
|
||||
import { useMemo } from 'react';
|
||||
import { isForcedMotionValue } from '../../motion/utils/is-forced-motion-value.mjs';
|
||||
import { buildHTMLStyles } from './utils/build-styles.mjs';
|
||||
import { createHtmlRenderState } from './utils/create-render-state.mjs';
|
||||
|
||||
function copyRawValuesOnly(target, source, props) {
|
||||
for (const key in source) {
|
||||
if (!isMotionValue(source[key]) && !isForcedMotionValue(key, props)) {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
function useInitialMotionValues({ transformTemplate }, visualState) {
|
||||
return useMemo(() => {
|
||||
const state = createHtmlRenderState();
|
||||
buildHTMLStyles(state, visualState, transformTemplate);
|
||||
return Object.assign({}, state.vars, state.style);
|
||||
}, [visualState]);
|
||||
}
|
||||
function useStyle(props, visualState) {
|
||||
const styleProp = props.style || {};
|
||||
const style = {};
|
||||
/**
|
||||
* Copy non-Motion Values straight into style
|
||||
*/
|
||||
copyRawValuesOnly(style, styleProp, props);
|
||||
Object.assign(style, useInitialMotionValues(props, visualState));
|
||||
return style;
|
||||
}
|
||||
function useHTMLProps(props, visualState) {
|
||||
// The `any` isn't ideal but it is the type of createElement props argument
|
||||
const htmlProps = {};
|
||||
const style = useStyle(props, visualState);
|
||||
if (props.drag && props.dragListener !== false) {
|
||||
// Disable the ghost element when a user drags
|
||||
htmlProps.draggable = false;
|
||||
// Disable text selection
|
||||
style.userSelect =
|
||||
style.WebkitUserSelect =
|
||||
style.WebkitTouchCallout =
|
||||
"none";
|
||||
// Disable scrolling on the draggable direction
|
||||
style.touchAction =
|
||||
props.drag === true
|
||||
? "none"
|
||||
: `pan-${props.drag === "x" ? "y" : "x"}`;
|
||||
}
|
||||
if (props.tabIndex === undefined &&
|
||||
(props.onTap || props.onTapStart || props.whileTap)) {
|
||||
htmlProps.tabIndex = 0;
|
||||
}
|
||||
htmlProps.style = style;
|
||||
return htmlProps;
|
||||
}
|
||||
|
||||
export { copyRawValuesOnly, useHTMLProps };
|
||||
62
node_modules/framer-motion/dist/es/render/html/utils/build-styles.mjs
generated
vendored
Normal file
62
node_modules/framer-motion/dist/es/render/html/utils/build-styles.mjs
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
import { transformProps, isCSSVariableName, getValueAsType, numberValueTypes } from 'motion-dom';
|
||||
import { buildTransform } from './build-transform.mjs';
|
||||
|
||||
function buildHTMLStyles(state, latestValues, transformTemplate) {
|
||||
const { style, vars, transformOrigin } = state;
|
||||
// Track whether we encounter any transform or transformOrigin values.
|
||||
let hasTransform = false;
|
||||
let hasTransformOrigin = false;
|
||||
/**
|
||||
* Loop over all our latest animated values and decide whether to handle them
|
||||
* as a style or CSS variable.
|
||||
*
|
||||
* Transforms and transform origins are kept separately for further processing.
|
||||
*/
|
||||
for (const key in latestValues) {
|
||||
const value = latestValues[key];
|
||||
if (transformProps.has(key)) {
|
||||
// If this is a transform, flag to enable further transform processing
|
||||
hasTransform = true;
|
||||
continue;
|
||||
}
|
||||
else if (isCSSVariableName(key)) {
|
||||
vars[key] = value;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
// Convert the value to its default value type, ie 0 -> "0px"
|
||||
const valueAsType = getValueAsType(value, numberValueTypes[key]);
|
||||
if (key.startsWith("origin")) {
|
||||
// If this is a transform origin, flag and enable further transform-origin processing
|
||||
hasTransformOrigin = true;
|
||||
transformOrigin[key] =
|
||||
valueAsType;
|
||||
}
|
||||
else {
|
||||
style[key] = valueAsType;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!latestValues.transform) {
|
||||
if (hasTransform || transformTemplate) {
|
||||
style.transform = buildTransform(latestValues, state.transform, transformTemplate);
|
||||
}
|
||||
else if (style.transform) {
|
||||
/**
|
||||
* If we have previously created a transform but currently don't have any,
|
||||
* reset transform style to none.
|
||||
*/
|
||||
style.transform = "none";
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Build a transformOrigin style. Uses the same defaults as the browser for
|
||||
* undefined origins.
|
||||
*/
|
||||
if (hasTransformOrigin) {
|
||||
const { originX = "50%", originY = "50%", originZ = 0, } = transformOrigin;
|
||||
style.transformOrigin = `${originX} ${originY} ${originZ}`;
|
||||
}
|
||||
}
|
||||
|
||||
export { buildHTMLStyles };
|
||||
60
node_modules/framer-motion/dist/es/render/html/utils/build-transform.mjs
generated
vendored
Normal file
60
node_modules/framer-motion/dist/es/render/html/utils/build-transform.mjs
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
import { transformPropOrder, getValueAsType, numberValueTypes } from 'motion-dom';
|
||||
|
||||
const translateAlias = {
|
||||
x: "translateX",
|
||||
y: "translateY",
|
||||
z: "translateZ",
|
||||
transformPerspective: "perspective",
|
||||
};
|
||||
const numTransforms = transformPropOrder.length;
|
||||
/**
|
||||
* Build a CSS transform style from individual x/y/scale etc properties.
|
||||
*
|
||||
* This outputs with a default order of transforms/scales/rotations, this can be customised by
|
||||
* providing a transformTemplate function.
|
||||
*/
|
||||
function buildTransform(latestValues, transform, transformTemplate) {
|
||||
// The transform string we're going to build into.
|
||||
let transformString = "";
|
||||
let transformIsDefault = true;
|
||||
/**
|
||||
* Loop over all possible transforms in order, adding the ones that
|
||||
* are present to the transform string.
|
||||
*/
|
||||
for (let i = 0; i < numTransforms; i++) {
|
||||
const key = transformPropOrder[i];
|
||||
const value = latestValues[key];
|
||||
if (value === undefined)
|
||||
continue;
|
||||
let valueIsDefault = true;
|
||||
if (typeof value === "number") {
|
||||
valueIsDefault = value === (key.startsWith("scale") ? 1 : 0);
|
||||
}
|
||||
else {
|
||||
valueIsDefault = parseFloat(value) === 0;
|
||||
}
|
||||
if (!valueIsDefault || transformTemplate) {
|
||||
const valueAsType = getValueAsType(value, numberValueTypes[key]);
|
||||
if (!valueIsDefault) {
|
||||
transformIsDefault = false;
|
||||
const transformName = translateAlias[key] || key;
|
||||
transformString += `${transformName}(${valueAsType}) `;
|
||||
}
|
||||
if (transformTemplate) {
|
||||
transform[key] = valueAsType;
|
||||
}
|
||||
}
|
||||
}
|
||||
transformString = transformString.trim();
|
||||
// If we have a custom `transform` template, pass our transform values and
|
||||
// generated transformString to that before returning
|
||||
if (transformTemplate) {
|
||||
transformString = transformTemplate(transform, transformIsDefault ? "" : transformString);
|
||||
}
|
||||
else if (transformIsDefault) {
|
||||
transformString = "none";
|
||||
}
|
||||
return transformString;
|
||||
}
|
||||
|
||||
export { buildTransform };
|
||||
8
node_modules/framer-motion/dist/es/render/html/utils/create-render-state.mjs
generated
vendored
Normal file
8
node_modules/framer-motion/dist/es/render/html/utils/create-render-state.mjs
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
const createHtmlRenderState = () => ({
|
||||
style: {},
|
||||
transform: {},
|
||||
transformOrigin: {},
|
||||
vars: {},
|
||||
});
|
||||
|
||||
export { createHtmlRenderState };
|
||||
17
node_modules/framer-motion/dist/es/render/html/utils/render.mjs
generated
vendored
Normal file
17
node_modules/framer-motion/dist/es/render/html/utils/render.mjs
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
function renderHTML(element, { style, vars }, styleProp, projection) {
|
||||
const elementStyle = element.style;
|
||||
let key;
|
||||
for (key in style) {
|
||||
// CSSStyleDeclaration has [index: number]: string; in the types, so we use that as key type.
|
||||
elementStyle[key] = style[key];
|
||||
}
|
||||
// Write projection styles directly to element style
|
||||
projection?.applyProjectionStyles(elementStyle, styleProp);
|
||||
for (key in vars) {
|
||||
// Loop over any CSS variables and assign those.
|
||||
// They can only be assigned using `setProperty`.
|
||||
elementStyle.setProperty(key, vars[key]);
|
||||
}
|
||||
}
|
||||
|
||||
export { renderHTML };
|
||||
19
node_modules/framer-motion/dist/es/render/html/utils/scrape-motion-values.mjs
generated
vendored
Normal file
19
node_modules/framer-motion/dist/es/render/html/utils/scrape-motion-values.mjs
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
import { isMotionValue } from 'motion-dom';
|
||||
import { isForcedMotionValue } from '../../../motion/utils/is-forced-motion-value.mjs';
|
||||
|
||||
function scrapeMotionValuesFromProps(props, prevProps, visualElement) {
|
||||
const { style } = props;
|
||||
const newValues = {};
|
||||
for (const key in style) {
|
||||
if (isMotionValue(style[key]) ||
|
||||
(prevProps.style &&
|
||||
isMotionValue(prevProps.style[key])) ||
|
||||
isForcedMotionValue(key, props) ||
|
||||
visualElement?.getValue(key)?.liveStyle !== undefined) {
|
||||
newValues[key] = style[key];
|
||||
}
|
||||
}
|
||||
return newValues;
|
||||
}
|
||||
|
||||
export { scrapeMotionValuesFromProps };
|
||||
Reference in New Issue
Block a user