{"version":3,"file":"index.cjs","sources":["../src/transform.js","../src/index.js"],"sourcesContent":["/**\n * CSS Mixin/Macro Transformation Engine\n * Transforms @mixin/@macro definitions and @apply rules into native CSS\n * Based on the CSS Mixins specification: https://drafts.csswg.org/css-mixins/\n */\n\n/* global document */\n\n/**\n * Handle string parsing in CSS\n */\nconst handleStrings = (char, previousChar, parseState) => {\n\tif ((char === '\"' || char === \"'\") && previousChar !== '\\\\') {\n\t\tif (!parseState.inString) {\n\t\t\tparseState.inString = true;\n\t\t\tparseState.stringChar = char;\n\t\t} else if (char === parseState.stringChar) {\n\t\t\tparseState.inString = false;\n\t\t\tparseState.stringChar = '';\n\t\t}\n\t}\n\n\treturn parseState.inString;\n};\n\n/**\n * Parse CSS rules with proper handling of nested structures\n */\nconst parseCSSRules = (cssText) => {\n\tconst rules = [];\n\tlet currentRule = '';\n\tlet braceCount = 0;\n\tlet inRule = false;\n\n\tconst parseState = {\n\t\tinString: false,\n\t\tstringChar: '',\n\t\tinComment: false\n\t};\n\n\tfor (let i = 0; i < cssText.length; i++) {\n\t\tconst char = cssText[i];\n\t\tconst nextChar = cssText[i + 1];\n\t\tconst previousChar = cssText[i - 1];\n\n\t\t// Handle comment start\n\t\tif (\n\t\t\t!parseState.inString &&\n\t\t\t!parseState.inComment &&\n\t\t\tchar === '/' &&\n\t\t\tnextChar === '*'\n\t\t) {\n\t\t\t// If we have accumulated content before the comment and we're not inside a rule, save it\n\t\t\tif (currentRule.trim() && !inRule) {\n\t\t\t\trules.push(currentRule.trim());\n\t\t\t\tcurrentRule = '';\n\t\t\t}\n\n\t\t\tparseState.inComment = true;\n\t\t\tcurrentRule += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle comment end\n\t\tif (parseState.inComment && char === '*' && nextChar === '/') {\n\t\t\tcurrentRule += char + nextChar;\n\t\t\tparseState.inComment = false;\n\n\t\t\t// Only save comment as a standalone rule if not inside a rule block\n\t\t\tif (!inRule) {\n\t\t\t\trules.push(currentRule.trim());\n\t\t\t\tcurrentRule = '';\n\t\t\t}\n\n\t\t\ti++; // Skip the next character\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (parseState.inComment) {\n\t\t\tcurrentRule += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle strings\n\t\thandleStrings(char, previousChar, parseState);\n\n\t\t// Handle braces (only when not in string)\n\t\tif (!parseState.inString) {\n\t\t\tif (char === '{') {\n\t\t\t\tbraceCount++;\n\t\t\t\tinRule = true;\n\t\t\t} else if (char === '}') {\n\t\t\t\tbraceCount--;\n\t\t\t}\n\t\t}\n\n\t\tcurrentRule += char;\n\n\t\t// Complete rule found\n\t\tif (inRule && braceCount === 0 && char === '}') {\n\t\t\trules.push(currentRule.trim());\n\t\t\tcurrentRule = '';\n\t\t\tinRule = false;\n\t\t}\n\t}\n\n\t// Handle any remaining content\n\tif (currentRule.trim()) {\n\t\trules.push(currentRule.trim());\n\t}\n\n\treturn rules;\n};\n\n/**\n * Extract content between the outermost braces of a text\n */\nconst extractBraceContent = (text) => {\n\tconst firstBrace = text.indexOf('{');\n\tif (firstBrace === -1) {\n\t\treturn '';\n\t}\n\n\tlet depth = 0;\n\tfor (let i = firstBrace; i < text.length; i++) {\n\t\tif (text[i] === '{') {\n\t\t\tdepth++;\n\t\t} else if (text[i] === '}') {\n\t\t\tdepth--;\n\t\t\tif (depth === 0) {\n\t\t\t\treturn text.slice(firstBrace + 1, i);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn '';\n};\n\n/**\n * Parse a single @mixin parameter string\n * Pattern: --name [<type>] [: default]\n */\nconst parseSingleParam = (paramString) => {\n\tconst trimmed = paramString.trim();\n\tif (!trimmed) {\n\t\treturn null;\n\t}\n\n\t// Match: --name, optionally followed by <type>, optionally followed by : default\n\tconst match = trimmed.match(/^(--[\\w-]+)\\s*(?:<[^>]+>)?\\s*(?::\\s*(.+))?$/);\n\tif (!match) {\n\t\treturn { name: trimmed, defaultValue: null };\n\t}\n\n\treturn {\n\t\tname: match[1],\n\t\tdefaultValue: match[2] ? match[2].trim() : null\n\t};\n};\n\n/**\n * Parse @mixin parameter list string into an array of parameter objects\n */\nconst parseMixinParams = (paramsString) => {\n\tconst trimmed = paramsString.trim();\n\tif (!trimmed) {\n\t\treturn [];\n\t}\n\n\tconst params = [];\n\tlet current = '';\n\tlet depth = 0;\n\n\tfor (const char of trimmed) {\n\t\tif (char === '(' || char === '<') {\n\t\t\tdepth++;\n\t\t} else if (char === ')' || char === '>') {\n\t\t\tdepth--;\n\t\t}\n\n\t\tif (char === ',' && depth === 0) {\n\t\t\tconst param = parseSingleParam(current);\n\t\t\tif (param) {\n\t\t\t\tparams.push(param);\n\t\t\t}\n\n\t\t\tcurrent = '';\n\t\t} else {\n\t\t\tcurrent += char;\n\t\t}\n\t}\n\n\tconst lastParam = parseSingleParam(current);\n\tif (lastParam) {\n\t\tparams.push(lastParam);\n\t}\n\n\treturn params;\n};\n\n/**\n * Extract @result blocks from a mixin body\n */\nconst extractResultBlocks = (body) => {\n\tconst blocks = [];\n\tlet index = 0;\n\n\twhile (index < body.length) {\n\t\tconst resultPos = body.indexOf('@result', index);\n\t\tif (resultPos === -1) {\n\t\t\tbreak;\n\t\t}\n\n\t\t// Make sure it's not part of another word\n\t\tif (resultPos > 0 && /[\\w-]/.test(body[resultPos - 1])) {\n\t\t\tindex = resultPos + 7;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Find the opening brace after @result\n\t\tlet braceStart = -1;\n\t\tfor (let i = resultPos + 7; i < body.length; i++) {\n\t\t\tif (body[i] === '{') {\n\t\t\t\tbraceStart = i;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (!/\\s/.test(body[i])) {\n\t\t\t\tbreak; // Non-whitespace before brace means invalid @result\n\t\t\t}\n\t\t}\n\n\t\tif (braceStart === -1) {\n\t\t\tindex = resultPos + 7;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Find matching closing brace\n\t\tlet depth = 0;\n\t\tlet braceEnd = -1;\n\t\tfor (let i = braceStart; i < body.length; i++) {\n\t\t\tif (body[i] === '{') {\n\t\t\t\tdepth++;\n\t\t\t} else if (body[i] === '}') {\n\t\t\t\tdepth--;\n\t\t\t\tif (depth === 0) {\n\t\t\t\t\tbraceEnd = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (braceEnd === -1) {\n\t\t\tindex = resultPos + 7;\n\t\t\tcontinue;\n\t\t}\n\n\t\tblocks.push(body.slice(braceStart + 1, braceEnd).trim());\n\t\tindex = braceEnd + 1;\n\t}\n\n\treturn blocks;\n};\n\n/**\n * Parse a @mixin definition from its rule text\n * Returns { type, name, params, body, resultBlocks } or null if invalid\n */\nconst parseMixinDefinition = (ruleText) => {\n\tconst trimmed = ruleText.trim();\n\n\t// Must match: @mixin --dashed-name(\n\tconst nameMatch = trimmed.match(/^@mixin\\s+(--[\\w-]+)\\s*\\(/);\n\tif (!nameMatch) {\n\t\treturn null;\n\t}\n\n\tconst name = nameMatch[1];\n\n\t// Find closing paren of parameter list\n\tlet parenDepth = 0;\n\tconst paramStart = trimmed.indexOf('(') + 1;\n\tlet paramEnd = -1;\n\n\tfor (let i = paramStart; i < trimmed.length; i++) {\n\t\tif (trimmed[i] === '(') {\n\t\t\tparenDepth++;\n\t\t} else if (trimmed[i] === ')') {\n\t\t\tif (parenDepth === 0) {\n\t\t\t\tparamEnd = i;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tparenDepth--;\n\t\t}\n\t}\n\n\tif (paramEnd === -1) {\n\t\treturn null;\n\t}\n\n\tconst paramsString = trimmed.slice(paramStart, paramEnd);\n\tconst params = parseMixinParams(paramsString);\n\tconst body = extractBraceContent(trimmed);\n\tconst resultBlocks = extractResultBlocks(body);\n\n\treturn { type: 'mixin', name, params, body, resultBlocks };\n};\n\n/**\n * Parse a @macro definition from its rule text\n * Returns { type, name, params, body } or null if invalid\n */\nconst parseMacroDefinition = (ruleText) => {\n\tconst trimmed = ruleText.trim();\n\n\t// Must match: @macro --dashed-name {\n\tconst nameMatch = trimmed.match(/^@macro\\s+(--[\\w-]+)\\s*\\{/);\n\tif (!nameMatch) {\n\t\treturn null;\n\t}\n\n\tconst name = nameMatch[1];\n\tconst body = extractBraceContent(trimmed);\n\n\treturn { type: 'macro', name, params: [], body };\n};\n\n/**\n * Split function arguments by commas, respecting nesting\n */\nconst splitArguments = (argumentsString) => {\n\tconst args = [];\n\tlet current = '';\n\tlet depth = 0;\n\n\tfor (const char of argumentsString) {\n\t\tif (char === '(' || char === '[') {\n\t\t\tdepth++;\n\t\t} else if (char === ')' || char === ']') {\n\t\t\tdepth--;\n\t\t}\n\n\t\tif (char === ',' && depth === 0) {\n\t\t\targs.push(current.trim());\n\t\t\tcurrent = '';\n\t\t} else {\n\t\t\tcurrent += char;\n\t\t}\n\t}\n\n\tif (current.trim()) {\n\t\targs.push(current.trim());\n\t}\n\n\treturn args;\n};\n\n/**\n * Substitute @contents rules in body text with the provided contents block\n */\nconst substituteContents = (body, contentsBlock) => {\n\tlet result = body;\n\tlet index = 0;\n\n\twhile (index < result.length) {\n\t\tconst contentsPos = result.indexOf('@contents', index);\n\t\tif (contentsPos === -1) {\n\t\t\tbreak;\n\t\t}\n\n\t\t// Check it's not part of another word\n\t\tif (contentsPos > 0 && /[\\w-]/.test(result[contentsPos - 1])) {\n\t\t\tindex = contentsPos + 9;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet pos = contentsPos + 9;\n\n\t\t// Skip whitespace\n\t\twhile (pos < result.length && /\\s/.test(result[pos])) {\n\t\t\tpos++;\n\t\t}\n\n\t\tlet replacement;\n\t\tlet endPos;\n\n\t\tif (pos < result.length && result[pos] === '{') {\n\t\t\t// @contents { fallback } form\n\t\t\tlet depth = 0;\n\t\t\tlet blockEnd = -1;\n\t\t\tfor (let i = pos; i < result.length; i++) {\n\t\t\t\tif (result[i] === '{') {\n\t\t\t\t\tdepth++;\n\t\t\t\t} else if (result[i] === '}') {\n\t\t\t\t\tdepth--;\n\t\t\t\t\tif (depth === 0) {\n\t\t\t\t\t\tblockEnd = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (blockEnd !== -1) {\n\t\t\t\tconst fallbackContent = result.slice(pos + 1, blockEnd).trim();\n\t\t\t\treplacement =\n\t\t\t\t\tcontentsBlock !== null ? contentsBlock : fallbackContent;\n\t\t\t\tendPos = blockEnd + 1;\n\t\t\t} else {\n\t\t\t\treplacement = contentsBlock || '';\n\t\t\t\tendPos = pos;\n\t\t\t}\n\t\t} else if (pos < result.length && result[pos] === ';') {\n\t\t\t// @contents; form (no fallback)\n\t\t\treplacement = contentsBlock || '';\n\t\t\tendPos = pos + 1;\n\t\t} else {\n\t\t\treplacement = contentsBlock || '';\n\t\t\tendPos = pos;\n\t\t}\n\n\t\tresult =\n\t\t\tresult.slice(0, contentsPos) + replacement + result.slice(endPos);\n\t\tindex = contentsPos + replacement.length;\n\t}\n\n\treturn result;\n};\n\n/**\n * Find @apply rules within a rule body text.\n * Returns an array of { start, end, name, args, contentsBlock }\n */\nconst findApplyRules = (bodyText) => {\n\tconst applies = [];\n\tlet index = 0;\n\n\twhile (index < bodyText.length) {\n\t\tconst applyPos = bodyText.indexOf('@apply', index);\n\t\tif (applyPos === -1) {\n\t\t\tbreak;\n\t\t}\n\n\t\t// Make sure it's not part of another word\n\t\tif (applyPos > 0 && /[\\w-]/.test(bodyText[applyPos - 1])) {\n\t\t\tindex = applyPos + 6;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet pos = applyPos + 6; // After \"@apply\"\n\n\t\t// Skip whitespace\n\t\twhile (pos < bodyText.length && /\\s/.test(bodyText[pos])) {\n\t\t\tpos++;\n\t\t}\n\n\t\t// Read the name (dashed-ident)\n\t\tlet name = '';\n\t\twhile (pos < bodyText.length && /[\\w-]/.test(bodyText[pos])) {\n\t\t\tname += bodyText[pos];\n\t\t\tpos++;\n\t\t}\n\n\t\tif (!name) {\n\t\t\tindex = applyPos + 6;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check for function arguments in parentheses\n\t\tlet args = [];\n\t\twhile (pos < bodyText.length && /\\s/.test(bodyText[pos])) {\n\t\t\tpos++;\n\t\t}\n\n\t\tif (pos < bodyText.length && bodyText[pos] === '(') {\n\t\t\tlet argDepth = 0;\n\t\t\tconst argStart = pos + 1;\n\t\t\tlet argEnd = -1;\n\n\t\t\tfor (let i = pos; i < bodyText.length; i++) {\n\t\t\t\tif (bodyText[i] === '(') {\n\t\t\t\t\targDepth++;\n\t\t\t\t} else if (bodyText[i] === ')') {\n\t\t\t\t\targDepth--;\n\t\t\t\t\tif (argDepth === 0) {\n\t\t\t\t\t\targEnd = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (argEnd !== -1) {\n\t\t\t\tconst argumentsString = bodyText.slice(argStart, argEnd).trim();\n\t\t\t\tif (argumentsString) {\n\t\t\t\t\targs = splitArguments(argumentsString);\n\t\t\t\t}\n\n\t\t\t\tpos = argEnd + 1;\n\t\t\t}\n\t\t}\n\n\t\t// Skip whitespace\n\t\twhile (pos < bodyText.length && /\\s/.test(bodyText[pos])) {\n\t\t\tpos++;\n\t\t}\n\n\t\t// Check for contents block\n\t\tlet contentsBlock = null;\n\t\tlet endPos;\n\n\t\tif (pos < bodyText.length && bodyText[pos] === '{') {\n\t\t\t// Parse contents block\n\t\t\tlet blockDepth = 0;\n\t\t\tlet blockEnd = -1;\n\n\t\t\tfor (let i = pos; i < bodyText.length; i++) {\n\t\t\t\tif (bodyText[i] === '{') {\n\t\t\t\t\tblockDepth++;\n\t\t\t\t} else if (bodyText[i] === '}') {\n\t\t\t\t\tblockDepth--;\n\t\t\t\t\tif (blockDepth === 0) {\n\t\t\t\t\t\tblockEnd = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (blockEnd !== -1) {\n\t\t\t\tcontentsBlock = bodyText.slice(pos + 1, blockEnd).trim();\n\t\t\t\tendPos = blockEnd + 1;\n\t\t\t} else {\n\t\t\t\tendPos = pos;\n\t\t\t}\n\t\t} else if (pos < bodyText.length && bodyText[pos] === ';') {\n\t\t\tendPos = pos + 1;\n\t\t} else {\n\t\t\t// No semicolon or block - still valid per spec\n\t\t\tendPos = pos;\n\t\t}\n\n\t\tapplies.push({\n\t\t\tstart: applyPos,\n\t\t\tend: endPos,\n\t\t\tname,\n\t\t\targs,\n\t\t\tcontentsBlock\n\t\t});\n\n\t\tindex = endPos;\n\t}\n\n\treturn applies;\n};\n\n/**\n * Substitute mixin parameters into the result body.\n * Replaces var(--paramName) with the argument value or default.\n */\nconst substituteParams = (body, params, args) => {\n\tlet result = body;\n\n\tfor (let i = 0; i < params.length; i++) {\n\t\tconst param = params[i];\n\t\tconst argValue = i < args.length ? args[i] : param.defaultValue;\n\n\t\tif (argValue !== null && argValue !== undefined) {\n\t\t\t// Replace var(--paramName) with the argument value\n\t\t\t// Handle var(--paramName) and var(--paramName, fallback)\n\t\t\tconst varPattern = new RegExp(\n\t\t\t\t`var\\\\(\\\\s*${param.name}\\\\s*(?:,[^)]*)?\\\\)`,\n\t\t\t\t'g'\n\t\t\t);\n\t\t\tresult = result.replace(varPattern, argValue);\n\t\t}\n\t}\n\n\treturn result;\n};\n\n/**\n * Process @apply rules within a body text, substituting mixin/macro content\n */\nconst processApplyInBody = (bodyText, definitions) => {\n\tconst applies = findApplyRules(bodyText);\n\tif (applies.length === 0) {\n\t\treturn bodyText;\n\t}\n\n\t// Process from right to left to preserve string indices\n\tlet result = bodyText;\n\tfor (let i = applies.length - 1; i >= 0; i--) {\n\t\tconst apply = applies[i];\n\t\tconst definition = definitions.get(apply.name);\n\n\t\tif (!definition) {\n\t\t\t// Unknown mixin/macro - remove the @apply rule (produces nothing)\n\t\t\tresult = result.slice(0, apply.start) + result.slice(apply.end);\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet substitution;\n\n\t\tif (definition.type === 'macro') {\n\t\t\t// Macro: direct substitution of body content\n\t\t\tsubstitution = definition.body;\n\t\t\t// Handle @contents substitution\n\t\t\tsubstitution = substituteContents(\n\t\t\t\tsubstitution,\n\t\t\t\tapply.contentsBlock\n\t\t\t);\n\t\t} else {\n\t\t\t// Mixin: substitute @result blocks with parameter handling\n\t\t\tif (definition.resultBlocks.length === 0) {\n\t\t\t\t// No @result blocks - mixin produces no output\n\t\t\t\tresult = result.slice(0, apply.start) + result.slice(apply.end);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Concatenate all @result blocks\n\t\t\tsubstitution = definition.resultBlocks.join('\\n');\n\n\t\t\t// Substitute parameters\n\t\t\tif (definition.params.length > 0) {\n\t\t\t\tsubstitution = substituteParams(\n\t\t\t\t\tsubstitution,\n\t\t\t\t\tdefinition.params,\n\t\t\t\t\tapply.args\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Handle @contents substitution\n\t\t\tsubstitution = substituteContents(\n\t\t\t\tsubstitution,\n\t\t\t\tapply.contentsBlock\n\t\t\t);\n\t\t}\n\n\t\t// Recursively process any nested @apply rules in the substitution\n\t\tsubstitution = processApplyInBody(substitution, definitions);\n\n\t\tresult =\n\t\t\tresult.slice(0, apply.start) +\n\t\t\tsubstitution +\n\t\t\tresult.slice(apply.end);\n\t}\n\n\treturn result;\n};\n\n/**\n * Process a complete CSS rule, substituting any @apply rules within it\n */\nconst processRule = (ruleText, definitions) => {\n\tconst trimmed = ruleText.trim();\n\n\t// Skip @mixin and @macro definitions (already extracted)\n\tif (trimmed.startsWith('@mixin ') || trimmed.startsWith('@macro ')) {\n\t\treturn '';\n\t}\n\n\t// Find the body\n\tconst firstBrace = trimmed.indexOf('{');\n\tif (firstBrace === -1) {\n\t\treturn ruleText; // Not a rule with braces, return as-is\n\t}\n\n\tconst lastBrace = trimmed.lastIndexOf('}');\n\tif (lastBrace === -1) {\n\t\treturn ruleText;\n\t}\n\n\tconst selector = trimmed.slice(0, firstBrace).trim();\n\tconst body = trimmed.slice(firstBrace + 1, lastBrace);\n\n\t// Process @apply rules in the body\n\tconst processedBody = processApplyInBody(body, definitions);\n\n\t// If the body is empty after processing, skip the rule\n\tif (!processedBody.trim()) {\n\t\treturn '';\n\t}\n\n\treturn `${selector} {\\n${processedBody}\\n}`;\n};\n\n/**\n * Transform CSS text containing @mixin/@macro/@apply into native CSS\n */\nconst transformToNativeCSS = (cssText) => {\n\tconst rules = parseCSSRules(cssText);\n\tconst definitions = new Map();\n\n\t// Phase 1: Extract all @mixin and @macro definitions\n\tfor (const rule of rules) {\n\t\tconst trimmed = rule.trim();\n\n\t\tif (trimmed.startsWith('@mixin ')) {\n\t\t\tconst definition = parseMixinDefinition(trimmed);\n\t\t\tif (definition) {\n\t\t\t\t// Per spec: later definitions overwrite earlier ones in same layer\n\t\t\t\tdefinitions.set(definition.name, definition);\n\t\t\t}\n\t\t} else if (trimmed.startsWith('@macro ')) {\n\t\t\tconst definition = parseMacroDefinition(trimmed);\n\t\t\tif (definition) {\n\t\t\t\tdefinitions.set(definition.name, definition);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Phase 2: Process remaining rules, substituting @apply references\n\tlet nativeCSS = '';\n\n\tfor (const rule of rules) {\n\t\tconst trimmed = rule.trim();\n\n\t\t// Skip definitions (already extracted)\n\t\tif (trimmed.startsWith('@mixin ') || trimmed.startsWith('@macro ')) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Skip standalone comments\n\t\tif (trimmed.startsWith('/*') && trimmed.endsWith('*/')) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst processed = processRule(trimmed, definitions);\n\t\tif (processed) {\n\t\t\tnativeCSS += processed + '\\n';\n\t\t}\n\t}\n\n\tconst totalRules = rules.filter(\n\t\t(r) =>\n\t\t\t!r.trim().startsWith('@mixin') &&\n\t\t\t!r.trim().startsWith('@macro') &&\n\t\t\t!r.trim().startsWith('/*')\n\t).length;\n\tconst transformedApplyCount = (cssText.match(/@apply/g) || []).length;\n\n\treturn {\n\t\tnativeCSS: nativeCSS.trim(),\n\t\truntimeCSS: '',\n\t\thasRuntimeRules: false,\n\t\tstats: {\n\t\t\ttotalRules,\n\t\t\ttransformedRules: transformedApplyCount\n\t\t}\n\t};\n};\n\n/**\n * Build-time transformation utility\n */\nconst buildTimeTransform = (cssText, options = {}) => {\n\tconst { minify = false } = options;\n\n\tconst result = transformToNativeCSS(cssText);\n\n\tif (minify) {\n\t\tresult.nativeCSS = result.nativeCSS\n\t\t\t.replaceAll(/\\s+/g, ' ')\n\t\t\t.replaceAll(/;\\s*}/g, '}')\n\t\t\t.replaceAll(/{\\s+/g, '{')\n\t\t\t.trim();\n\t}\n\n\treturn result;\n};\n\n/**\n * Runtime transformation utility (for integration with the browser polyfill)\n */\nconst runtimeTransform = (cssText, element) => {\n\tconst result = transformToNativeCSS(cssText);\n\n\t// Apply transformed CSS immediately if we have it\n\tif (result.nativeCSS && element) {\n\t\tconst style = document.createElement('style');\n\t\tstyle.textContent = result.nativeCSS;\n\t\tstyle.dataset.cssMixinNative = 'true';\n\t\tdocument.head.append(style);\n\t}\n\n\treturn {\n\t\tprocessedCSS: result.nativeCSS,\n\t\thasRuntimeRules: false,\n\t\tnativeCSS: result.nativeCSS\n\t};\n};\n\nexport {\n\tbuildTimeTransform,\n\textractResultBlocks,\n\tfindApplyRules,\n\tparseCSSRules,\n\tparseMacroDefinition,\n\tparseMixinDefinition,\n\tprocessApplyInBody,\n\truntimeTransform,\n\tsubstituteContents,\n\tsubstituteParams,\n\ttransformToNativeCSS\n};\n","/**\n * CSS Mixin/Macro Polyfill\n * Provides browser support for CSS @mixin, @macro, and @apply rules\n * Based on the CSS Mixins specification: https://drafts.csswg.org/css-mixins/\n */\n\n/* global document, CSS, Node, MutationObserver */\n\nimport { transformToNativeCSS } from './transform.js';\n\n// Global state\nlet polyfillOptions = {\n\tdebug: false,\n\tautoInit: true\n};\n\n/**\n * Log debug messages\n */\nconst log = (...arguments_) => {\n\tif (polyfillOptions.debug) {\n\t\tconsole.log('[CSS Mixin and Macro Polyfill]', ...arguments_);\n\t}\n};\n\n/**\n * Check if browser has native CSS @mixin/@macro support\n */\nconst hasNativeSupport = () => {\n\tif (globalThis.window === undefined || !globalThis.CSS) {\n\t\treturn false;\n\t}\n\n\t// No browser currently supports @mixin/@macro natively\n\t// This check can be updated when browsers add support\n\treturn false;\n};\n\n/**\n * Check if CSS text contains @mixin, @macro, or @apply rules\n */\nconst containsMixinSyntax = (cssText) =>\n\tcssText.includes('@mixin ') ||\n\tcssText.includes('@macro ') ||\n\tcssText.includes('@apply ');\n\n/**\n * Process CSS text by transforming @mixin/@macro/@apply rules\n */\nconst processCSSText = (cssText, options = {}) => {\n\t// Set options for this processing session\n\tconst originalOptions = { ...polyfillOptions };\n\tpolyfillOptions = { ...polyfillOptions, ...options };\n\n\ttry {\n\t\tif (!containsMixinSyntax(cssText)) {\n\t\t\treturn cssText;\n\t\t}\n\n\t\tconst result = transformToNativeCSS(cssText);\n\n\t\tlog(\n\t\t\t`Transformed CSS: ${result.stats.transformedRules} @apply rules processed`\n\t\t);\n\n\t\treturn result.nativeCSS;\n\t} finally {\n\t\tpolyfillOptions = originalOptions;\n\t}\n};\n\n/**\n * Process a style element by rewriting its content\n */\nconst processStyleElement = (styleElement) => {\n\tif (styleElement.dataset.cssMixinMacroPolyfillProcessed) {\n\t\treturn; // Already processed\n\t}\n\n\tconst originalContent = styleElement.textContent;\n\tconst processedContent = processCSSText(originalContent);\n\n\tif (processedContent !== originalContent) {\n\t\tlog(\n\t\t\t'Processing style element, original length:',\n\t\t\toriginalContent.length\n\t\t);\n\t\tstyleElement.textContent = processedContent;\n\t\tstyleElement.dataset.cssMixinMacroPolyfillProcessed = 'true';\n\t\tlog('Style element processed, new length:', processedContent.length);\n\t}\n};\n\n/**\n * Process all existing style elements\n */\nconst processExistingStylesheets = () => {\n\t// Process inline style elements\n\tconst styleElements = document.querySelectorAll(\n\t\t'style:not([data-css-mixin-polyfill-processed])'\n\t);\n\tlog(`Found ${styleElements.length} unprocessed style elements`);\n\n\tfor (const styleElement of styleElements) {\n\t\tprocessStyleElement(styleElement);\n\t}\n\n\t// Process link stylesheets that we can access\n\tconst linkElements = document.querySelectorAll('link[rel=\"stylesheet\"]');\n\tfor (const linkElement of linkElements) {\n\t\tprocessLinkStylesheet(linkElement);\n\t}\n};\n\n/**\n * Process external stylesheet (if accessible)\n */\nasync function processLinkStylesheet(linkElement) {\n\tif (linkElement.dataset.cssMixinMacroPolyfillProcessed) {\n\t\treturn;\n\t}\n\n\t// Only process same-origin stylesheets\n\ttry {\n\t\tconst url = new URL(linkElement.href);\n\t\tif (url.origin !== globalThis.location.origin) {\n\t\t\tlog('Skipping cross-origin stylesheet:', linkElement.href);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await fetch(linkElement.href);\n\t\t\tconst cssText = await response.text();\n\n\t\t\tconst processedCssText = processCSSText(cssText);\n\n\t\t\tif (processedCssText !== cssText) {\n\t\t\t\tconst styleElement = document.createElement('style');\n\t\t\t\tstyleElement.textContent = processedCssText;\n\t\t\t\tstyleElement.dataset.cssMixinMacroPolyfillProcessed = 'true';\n\t\t\t\tstyleElement.dataset.originalHref = linkElement.href;\n\n\t\t\t\t// Insert the style element after the link element\n\t\t\t\tlinkElement.parentNode.insertBefore(\n\t\t\t\t\tstyleElement,\n\t\t\t\t\tlinkElement.nextSibling\n\t\t\t\t);\n\n\t\t\t\t// Disable the original link (but don't remove it for compatibility)\n\t\t\t\tlinkElement.disabled = true;\n\t\t\t\tlinkElement.dataset.cssMixinMacroPolyfillProcessed = 'true';\n\n\t\t\t\tlog(\n\t\t\t\t\t'External stylesheet processed and replaced:',\n\t\t\t\t\tlinkElement.href\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlog(\n\t\t\t\t'Could not fetch external stylesheet:',\n\t\t\t\tlinkElement.href,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tlog('Error processing external stylesheet:', error);\n\t}\n}\n\n/**\n * Observe stylesheet changes\n */\nconst observeStylesheetChanges = () => {\n\tconst observer = new MutationObserver((mutations) => {\n\t\tfor (const mutation of mutations) {\n\t\t\tfor (const node of mutation.addedNodes) {\n\t\t\t\tif (\n\t\t\t\t\tnode.nodeType === Node.ELEMENT_NODE &&\n\t\t\t\t\t(node.tagName === 'STYLE' || node.tagName === 'LINK')\n\t\t\t\t) {\n\t\t\t\t\tlog('New style element detected:', node.tagName);\n\n\t\t\t\t\tif (node.tagName === 'STYLE') {\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tprocessStyleElement(node);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tnode.tagName === 'LINK' &&\n\t\t\t\t\t\tnode.rel === 'stylesheet'\n\t\t\t\t\t) {\n\t\t\t\t\t\tnode.addEventListener('load', () => {\n\t\t\t\t\t\t\tprocessLinkStylesheet(node);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tprocessLinkStylesheet(node);\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tobserver.observe(document.head, {\n\t\tchildList: true,\n\t\tsubtree: true\n\t});\n\n\tobserver.observe(document.body, {\n\t\tchildList: true,\n\t\tsubtree: true\n\t});\n};\n\n/**\n * Initialize the polyfill\n */\nconst init = (options = {}) => {\n\tif (globalThis.window === undefined) {\n\t\tthrow new TypeError(\n\t\t\t'CSS mixin/macro polyfill requires a browser environment'\n\t\t);\n\t}\n\n\t// Update global options\n\tpolyfillOptions = { ...polyfillOptions, ...options };\n\n\tif (hasNativeSupport()) {\n\t\tlog('Native CSS @mixin/@macro support detected, polyfill not needed');\n\t\treturn;\n\t}\n\n\tlog('Initializing CSS mixin/macro polyfill');\n\tprocessExistingStylesheets();\n\tobserveStylesheetChanges();\n};\n\n/**\n * Public API to manually trigger processing\n */\nconst refresh = () => {\n\tprocessExistingStylesheets();\n};\n\n// Auto-initialize if in browser and DOMContentLoaded\nif (globalThis.window !== undefined && typeof document !== 'undefined') {\n\tif (document.readyState === 'loading') {\n\t\tdocument.addEventListener('DOMContentLoaded', () => {\n\t\t\tinit();\n\t\t});\n\t} else {\n\t\tinit();\n\t}\n}\n\n// Re-export build-time transformation\nexport { buildTimeTransform } from './transform.js';\nexport { hasNativeSupport, init, processCSSText, refresh };\n"],"names":["handleStrings","char","previousChar","parseState","inString","stringChar","extractBraceContent","text","firstBrace","indexOf","depth","i","length","slice","parseSingleParam","paramString","trimmed","trim","match","name","defaultValue","parseMixinDefinition","ruleText","nameMatch","parenDepth","paramStart","paramEnd","params","paramsString","_step","current","_iterator","_createForOfIteratorHelperLoose","done","value","param","push","lastParam","parseMixinParams","body","resultBlocks","blocks","index","resultPos","test","braceStart","braceEnd","extractResultBlocks","type","parseMacroDefinition","splitArguments","argumentsString","_step2","args","_iterator2","substituteContents","contentsBlock","result","contentsPos","pos","replacement","endPos","blockEnd","fallbackContent","substituteParams","argValue","varPattern","RegExp","replace","processApplyInBody","bodyText","definitions","applies","applyPos","argDepth","argStart","argEnd","blockDepth","start","end","findApplyRules","apply","definition","get","substitution","join","processRule","startsWith","lastBrace","lastIndexOf","selector","processedBody","transformToNativeCSS","cssText","_step3","rules","currentRule","braceCount","inRule","inComment","nextChar","parseCSSRules","Map","_iterator3","set","_step4","nativeCSS","_iterator4","endsWith","processed","totalRules","filter","r","transformedApplyCount","runtimeCSS","hasRuntimeRules","stats","transformedRules","_catch","recover","e","then","processLinkStylesheet","linkElement","dataset","cssMixinMacroPolyfillProcessed","Promise","resolve","URL","href","origin","globalThis","location","_temp","fetch","response","processedCssText","processCSSText","styleElement","document","createElement","textContent","originalHref","parentNode","insertBefore","nextSibling","disabled","log","error","reject","polyfillOptions","debug","autoInit","_console","console","concat","call","arguments","hasNativeSupport","undefined","window","options","originalOptions","_extends","includes","containsMixinSyntax","processStyleElement","originalContent","processedContent","processExistingStylesheets","styleElements","querySelectorAll","init","TypeError","observer","MutationObserver","mutations","_loop","node","nodeType","Node","ELEMENT_NODE","tagName","setTimeout","rel","addEventListener","addedNodes","observe","head","childList","subtree","readyState","_options$minify","minify","replaceAll"],"mappings":"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"}