{"version":3,"file":"parseSVGStyle.mjs","sources":["../../../../../src/scene/graphics/shared/svg/parseSVGStyle.ts"],"sourcesContent":["import { Color } from '../../../../color/Color';\nimport { extractSvgUrlId } from './utils/extractSvgUrlId';\n\nimport type { ConvertedFillStyle, ConvertedStrokeStyle, FillStyle, StrokeStyle } from '../FillTypes';\nimport type { Session } from './SVGParser';\n\n/**\n * A map of SVG style attributes and their default values.\n * Each attribute has a type and default value used for SVG parsing.\n * - 'paint' type can be a color or gradient\n * - 'number' type is a numeric value\n * - 'string' type is a text value\n * @category scene\n * @advanced\n */\nexport const styleAttributes = {\n    // Fill properties\n    fill: { type: 'paint', default: 0 }, // Fill color/gradient\n    'fill-opacity': { type: 'number', default: 1 }, // Fill transparency\n\n    // Stroke properties\n    stroke: { type: 'paint', default: 0 }, // Stroke color/gradient\n    'stroke-width': { type: 'number', default: 1 }, // Width of stroke\n    'stroke-opacity': { type: 'number', default: 1 }, // Stroke transparency\n    'stroke-linecap': { type: 'string', default: 'butt' }, // End cap style: butt, round, square\n    'stroke-linejoin': { type: 'string', default: 'miter' }, // Join style: miter, round, bevel\n    'stroke-miterlimit': { type: 'number', default: 10 }, // Limit on miter join sharpness\n    'stroke-dasharray': { type: 'string', default: 'none' }, // Dash pattern\n    'stroke-dashoffset': { type: 'number', default: 0 }, // Offset for dash pattern\n\n    // Global properties\n    opacity: { type: 'number', default: 1 }, // Overall opacity\n};\n\n/**\n * Represents the result of parsing SVG style attributes\n * @internal\n */\nexport type StyleResult = {\n    /** The stroke style properties */\n    strokeStyle: StrokeStyle;\n    /** The fill style properties */\n    fillStyle: FillStyle;\n    /** Whether fill should be applied */\n    useFill: boolean;\n    /** Whether stroke should be applied */\n    useStroke: boolean;\n};\n\n/**\n * Parses SVG style attributes and inline styles to determine fill and stroke properties.\n * Handles both direct attributes and CSS-style declarations in the style attribute.\n * @param svg - The SVG element to parse styles from\n * @param session - The current SVG parsing session containing definitions\n * @returns An object containing the parsed fill and stroke styles\n * @internal\n */\nexport function parseSVGStyle(svg: SVGElement, session: Session): StyleResult\n{\n    const style = svg.getAttribute('style');\n\n    const strokeStyle: StrokeStyle = {};\n\n    const fillStyle: FillStyle = {};\n\n    const result: StyleResult = {\n        strokeStyle,\n        fillStyle,\n        useFill: false,\n        useStroke: false,\n    };\n\n    // First parse direct style attributes\n    for (const key in styleAttributes)\n    {\n        const attribute = svg.getAttribute(key);\n\n        if (attribute)\n        {\n            parseAttribute(session, result, key, attribute.trim());\n        }\n    }\n\n    // Then parse inline styles which override direct attributes\n    if (style)\n    {\n        const styleParts = style.split(';');\n\n        for (let i = 0; i < styleParts.length; i++)\n        {\n            const stylePart = styleParts[i].trim();\n\n            const [key, value] = stylePart.split(':');\n\n            if (styleAttributes[key as keyof typeof styleAttributes])\n            {\n                parseAttribute(session, result, key, value.trim());\n            }\n        }\n    }\n\n    return {\n        strokeStyle: result.useStroke ? (strokeStyle as ConvertedStrokeStyle) : null,\n        fillStyle: result.useFill ? (fillStyle as ConvertedFillStyle) : null,\n        useFill: result.useFill,\n        useStroke: result.useStroke,\n    };\n}\n\n/**\n * Parses a single SVG style attribute and updates the style result accordingly.\n * Handles color values, gradients, opacities and other style properties.\n * @param session - The current SVG parsing session containing definitions\n * @param result - The style result object to update\n * @param id - The attribute name/id to parse\n * @param value - The attribute value to parse\n */\nfunction parseAttribute(\n    session: Session,\n    result: StyleResult,\n    id: string,\n    value: string\n): void\n{\n    switch (id)\n    {\n        case 'stroke':\n            if (value !== 'none')\n            {\n                if (value.startsWith('url('))\n                {\n                    // Extract gradient/pattern id from url reference\n                    const id = extractSvgUrlId(value);\n\n                    result.strokeStyle.fill = session.defs[id];\n                }\n                else\n                {\n                    // Parse as color value\n                    result.strokeStyle.color = Color.shared.setValue(value).toNumber();\n                }\n\n                result.useStroke = true;\n            }\n\n            break;\n        case 'stroke-width':\n            result.strokeStyle.width = Number(value);\n            break;\n        case 'fill':\n            if (value !== 'none')\n            {\n                if (value.startsWith('url('))\n                {\n                    // Extract gradient/pattern id from url reference\n                    const id = extractSvgUrlId(value);\n\n                    result.fillStyle.fill = session.defs[id];\n                }\n                else\n                {\n                    // Parse as color value\n                    result.fillStyle.color = Color.shared.setValue(value).toNumber();\n                }\n\n                result.useFill = true;\n            }\n            break;\n        case 'fill-opacity':\n            result.fillStyle.alpha = Number(value);\n            break;\n        case 'stroke-opacity':\n            result.strokeStyle.alpha = Number(value);\n            break;\n        case 'opacity':\n            // Global opacity affects both fill and stroke\n            result.fillStyle.alpha = Number(value);\n            result.strokeStyle.alpha = Number(value);\n            break;\n    }\n}\n"],"names":["id"],"mappings":"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"}