All files / src/render/svg/utils build-attrs.ts

100% Statements 30/30
83.33% Branches 20/24
100% Functions 1/1
100% Lines 25/25

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69  34x   34x 34x             34x     35x 35x 35x 35x 35x 35x 35x   35x         35x   35x 35x 105x         35x 9x 9x       35x       4x               35x 35x     35x 3x                  
import { DOMVisualElementOptions } from "../../dom/types"
import { buildHTMLStyles } from "../../html/utils/build-styles"
import { ResolvedValues } from "../../types"
import { calcSVGTransformOrigin } from "./transform-origin"
import { buildSVGPath } from "./path"
import { MotionProps } from "../../../motion/types"
import { SVGRenderState } from "../types"
 
/**
 * Build SVG visual attrbutes, like cx and style.transform
 */
export function buildSVGAttrs(
    state: SVGRenderState,
    {
        attrX,
        attrY,
        originX,
        originY,
        pathLength,
        pathSpacing = 1,
        pathOffset = 0,
        // This is object creation, which we try to avoid per-frame.
        ...latest
    }: ResolvedValues,
    options: DOMVisualElementOptions,
    transformTemplate?: MotionProps["transformTemplate"]
) {
    buildHTMLStyles(state, latest, options, transformTemplate)
 
    state.attrs = state.style
    state.style = {}
    const { attrs, style, dimensions } = state
    /**
     * However, we apply transforms as CSS transforms. So if we detect a transform we take it from attrs
     * and copy it into style.
     */
    if (attrs.transform) {
        if (dimensions) style.transform = attrs.transform
        delete attrs.transform
    }
 
    // Parse transformOrigin
    if (
        dimensions &&
        (originX !== undefined || originY !== undefined || style.transform)
    ) {
        style.transformOrigin = calcSVGTransformOrigin(
            dimensions,
            originX !== undefined ? originX : 0.5,
            originY !== undefined ? originY : 0.5
        )
    }
 
    // Treat x/y not as shortcuts but as actual attributes
    if (attrX !== undefined) attrs.x = attrX
    if (attrY !== undefined) attrs.y = attrY
 
    // Build SVG path if one has been defined
    if (pathLength !== undefined) {
        buildSVGPath(
            attrs,
            pathLength as number,
            pathSpacing as number,
            pathOffset as number,
            false
        )
    }
}