build-styles.mjs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { isCSSVariableName } from '../../dom/utils/is-css-variable.mjs';
  2. import { getValueAsType } from '../../dom/value-types/get-as-type.mjs';
  3. import { numberValueTypes } from '../../dom/value-types/number.mjs';
  4. import { buildTransform } from './build-transform.mjs';
  5. import { transformProps } from './keys-transform.mjs';
  6. function buildHTMLStyles(state, latestValues, transformTemplate) {
  7. const { style, vars, transformOrigin } = state;
  8. // Track whether we encounter any transform or transformOrigin values.
  9. let hasTransform = false;
  10. let hasTransformOrigin = false;
  11. /**
  12. * Loop over all our latest animated values and decide whether to handle them
  13. * as a style or CSS variable.
  14. *
  15. * Transforms and transform origins are kept separately for further processing.
  16. */
  17. for (const key in latestValues) {
  18. const value = latestValues[key];
  19. if (transformProps.has(key)) {
  20. // If this is a transform, flag to enable further transform processing
  21. hasTransform = true;
  22. continue;
  23. }
  24. else if (isCSSVariableName(key)) {
  25. vars[key] = value;
  26. continue;
  27. }
  28. else {
  29. // Convert the value to its default value type, ie 0 -> "0px"
  30. const valueAsType = getValueAsType(value, numberValueTypes[key]);
  31. if (key.startsWith("origin")) {
  32. // If this is a transform origin, flag and enable further transform-origin processing
  33. hasTransformOrigin = true;
  34. transformOrigin[key] =
  35. valueAsType;
  36. }
  37. else {
  38. style[key] = valueAsType;
  39. }
  40. }
  41. }
  42. if (!latestValues.transform) {
  43. if (hasTransform || transformTemplate) {
  44. style.transform = buildTransform(latestValues, state.transform, transformTemplate);
  45. }
  46. else if (style.transform) {
  47. /**
  48. * If we have previously created a transform but currently don't have any,
  49. * reset transform style to none.
  50. */
  51. style.transform = "none";
  52. }
  53. }
  54. /**
  55. * Build a transformOrigin style. Uses the same defaults as the browser for
  56. * undefined origins.
  57. */
  58. if (hasTransformOrigin) {
  59. const { originX = "50%", originY = "50%", originZ = 0, } = transformOrigin;
  60. style.transformOrigin = `${originX} ${originY} ${originZ}`;
  61. }
  62. }
  63. export { buildHTMLStyles };