@styleframe/figma 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +440 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +831 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/code.js +3803 -0
- package/dist/plugin/ui.html +1045 -0
- package/manifest.json +16 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["COMPOSABLE_MAP: Record<string, string>","variables: ParsedVariable[]","type: ParsedVariable[\"type\"]","referenceTo: string | undefined","value: string | number | boolean","themeStyleframeValue: string | number | boolean","themes: ParsedTheme[]","identifiers: string[]","valueEntries: string[]","lines: string[]","imports: string[]","code","doc: DTCGDocument","token: DTCGToken","modeValues: Record<string, DTCGTokenValue>","current: DTCGGroup","contexts: Record<string, DTCGModifierContext>","context: DTCGModifierContext","variables: FigmaExportVariable[]","sfExtension","aliasTo: string | undefined","values: Record<string, unknown>"],"sources":["../src/converters/name-mapping.ts","../src/converters/value-parsing.ts","../src/converters/codegen.ts","../src/converters/dtcg/types.ts","../src/converters/dtcg/type-mapping.ts","../src/converters/dtcg/alias-parsing.ts","../src/converters/dtcg/to-dtcg.ts","../src/converters/dtcg/from-dtcg.ts"],"sourcesContent":["/**\n * Convert Styleframe variable name to Figma format\n * @example \"color.primary\" → \"color/primary\"\n */\nexport function styleframeToFigmaName(name: string): string {\n\treturn name.replace(/\\./g, \"/\");\n}\n\n/**\n * Convert Figma variable name to Styleframe format\n * @example \"color/primary\" → \"color.primary\"\n */\nexport function figmaToStyleframeName(name: string): string {\n\treturn name.replace(/\\//g, \".\");\n}\n\n/**\n * Extract the category (first segment) from a variable name\n * @example \"color.primary.500\" → \"color\"\n * @example \"color/primary/500\" → \"color\"\n */\nexport function extractCategory(name: string): string {\n\tconst separator = name.includes(\"/\") ? \"/\" : \".\";\n\treturn name.split(separator)[0] ?? \"\";\n}\n\n/**\n * Extract the key (last segment) from a variable name\n * @example \"color.primary.500\" → \"500\"\n * @example \"spacing.md\" → \"md\"\n */\nexport function extractKey(name: string): string {\n\tconst separator = name.includes(\"/\") ? \"/\" : \".\";\n\tconst parts = name.split(separator);\n\treturn parts[parts.length - 1] ?? \"\";\n}\n\n/**\n * Convert a Styleframe variable name to a camelCase JavaScript identifier\n * @example \"color.primary\" → \"colorPrimary\"\n * @example \"spacing.md\" → \"spacingMd\"\n */\nexport function toVariableIdentifier(name: string): string {\n\tconst styleframeName = name.includes(\"/\")\n\t\t? figmaToStyleframeName(name)\n\t\t: name;\n\treturn styleframeName\n\t\t.split(\".\")\n\t\t.map((part, index) =>\n\t\t\tindex === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1),\n\t\t)\n\t\t.join(\"\");\n}\n\n/**\n * Convert a CSS custom property name to Styleframe format\n * @example \"--color--primary\" → \"color.primary\"\n */\nexport function cssVariableToStyleframeName(cssName: string): string {\n\treturn cssName.replace(/^--/, \"\").replace(/--/g, \".\");\n}\n\n/**\n * Convert a Styleframe name to CSS custom property format\n * @example \"color.primary\" → \"--color--primary\"\n */\nexport function styleframeToCssVariable(name: string): string {\n\treturn `--${name.replace(/\\./g, \"--\")}`;\n}\n","import { parse, formatHex, formatHex8 } from \"culori\";\nimport type { FigmaRGBA, FigmaVariableType } from \"../types\";\n\n/**\n * Convert a CSS color string to Figma RGBA format (0-1 range)\n * Supports: hex, rgb(), rgba(), hsl(), hsla(), named colors\n */\nexport function cssColorToFigma(value: string): FigmaRGBA | null {\n\tconst parsed = parse(value);\n\tif (!parsed) return null;\n\n\t// culori returns values in 0-1 range for r, g, b\n\t// and alpha is also 0-1\n\tconst rgb = parsed as { r?: number; g?: number; b?: number; alpha?: number };\n\n\treturn {\n\t\tr: rgb.r ?? 0,\n\t\tg: rgb.g ?? 0,\n\t\tb: rgb.b ?? 0,\n\t\ta: rgb.alpha ?? 1,\n\t};\n}\n\n/**\n * Convert Figma RGBA format (0-1 range) to CSS hex color\n */\nexport function figmaColorToCss(rgba: FigmaRGBA): string {\n\tconst color = {\n\t\tmode: \"rgb\" as const,\n\t\tr: rgba.r,\n\t\tg: rgba.g,\n\t\tb: rgba.b,\n\t\talpha: rgba.a ?? 1,\n\t};\n\n\t// Use hex8 if alpha is not 1, otherwise use hex\n\tif (rgba.a !== undefined && rgba.a < 1) {\n\t\treturn formatHex8(color) ?? \"#000000\";\n\t}\n\treturn formatHex(color) ?? \"#000000\";\n}\n\n/**\n * Parse a CSS dimension value (e.g., \"16px\", \"1rem\", \"1.5em\")\n */\nexport interface ParsedDimension {\n\tvalue: number;\n\tunit: string;\n}\n\nexport function parseDimension(value: string): ParsedDimension | null {\n\tconst match = value.match(/^(-?\\d*\\.?\\d+)(px|rem|em|%|vh|vw|vmin|vmax|ch)?$/);\n\tif (!match) return null;\n\n\treturn {\n\t\tvalue: Number.parseFloat(match[1] ?? \"0\"),\n\t\tunit: match[2] ?? \"\",\n\t};\n}\n\n/**\n * Convert a CSS dimension to a pixel number\n */\nexport function dimensionToPixels(\n\tvalue: string,\n\tbaseFontSize: number = 16,\n): number | null {\n\tconst parsed = parseDimension(value);\n\tif (!parsed) return null;\n\n\tswitch (parsed.unit) {\n\t\tcase \"px\":\n\t\tcase \"\":\n\t\t\treturn parsed.value;\n\t\tcase \"rem\":\n\t\tcase \"em\":\n\t\t\treturn parsed.value * baseFontSize;\n\t\tcase \"%\":\n\t\t\treturn parsed.value; // Keep percentage as-is for Figma\n\t\tdefault:\n\t\t\treturn null; // Unsupported units (vh, vw, etc.)\n\t}\n}\n\n/**\n * Convert a pixel value to a CSS dimension\n */\nexport function pixelsToDimension(\n\tpixels: number,\n\tunit: string = \"px\",\n\tbaseFontSize: number = 16,\n): string {\n\tswitch (unit) {\n\t\tcase \"rem\":\n\t\t\treturn `${pixels / baseFontSize}rem`;\n\t\tcase \"em\":\n\t\t\treturn `${pixels / baseFontSize}em`;\n\t\tcase \"%\":\n\t\t\treturn `${pixels}%`;\n\t\tcase \"px\":\n\t\tdefault:\n\t\t\treturn `${pixels}px`;\n\t}\n}\n\n/**\n * Detect if a string value is a color\n */\nexport function isColorValue(value: string): boolean {\n\t// Check for common color formats\n\tif (value.startsWith(\"#\")) return true;\n\tif (value.startsWith(\"rgb\")) return true;\n\tif (value.startsWith(\"hsl\")) return true;\n\tif (value.startsWith(\"oklch\")) return true;\n\tif (value.startsWith(\"oklab\")) return true;\n\tif (value.startsWith(\"lch\")) return true;\n\tif (value.startsWith(\"lab\")) return true;\n\n\t// Try to parse with culori\n\tconst parsed = parse(value);\n\treturn parsed !== undefined;\n}\n\n/**\n * Detect if a string value is a dimension\n */\nexport function isDimensionValue(value: string): boolean {\n\treturn parseDimension(value) !== null;\n}\n\n/**\n * Detect the Figma variable type from a Styleframe value\n */\nexport function detectFigmaType(value: unknown): FigmaVariableType {\n\tif (typeof value === \"boolean\") return \"BOOLEAN\";\n\tif (typeof value === \"number\") return \"FLOAT\";\n\tif (typeof value === \"string\") {\n\t\tif (isColorValue(value)) return \"COLOR\";\n\t\tif (isDimensionValue(value)) return \"FLOAT\";\n\t\treturn \"STRING\";\n\t}\n\treturn \"STRING\";\n}\n\n/**\n * Convert a Styleframe token value to a Figma-compatible value\n */\nexport function styleframeValueToFigma(\n\tvalue: unknown,\n\ttype: FigmaVariableType,\n\tbaseFontSize: number = 16,\n): FigmaRGBA | number | string | boolean | null {\n\tif (typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\") return value;\n\tif (typeof value !== \"string\") return null;\n\n\tswitch (type) {\n\t\tcase \"COLOR\": {\n\t\t\treturn cssColorToFigma(value);\n\t\t}\n\t\tcase \"FLOAT\": {\n\t\t\tconst pixels = dimensionToPixels(value, baseFontSize);\n\t\t\treturn pixels;\n\t\t}\n\t\tcase \"BOOLEAN\": {\n\t\t\treturn value === \"true\";\n\t\t}\n\t\tcase \"STRING\":\n\t\tdefault: {\n\t\t\treturn value;\n\t\t}\n\t}\n}\n\n/**\n * Convert a Figma variable value to a Styleframe-compatible CSS value\n */\nexport function figmaValueToStyleframe(\n\tvalue: FigmaRGBA | number | string | boolean,\n\ttype: FigmaVariableType,\n\tuseRem: boolean = false,\n\tbaseFontSize: number = 16,\n): string | number | boolean {\n\tswitch (type) {\n\t\tcase \"COLOR\": {\n\t\t\tif (typeof value === \"object\" && \"r\" in value) {\n\t\t\t\treturn figmaColorToCss(value as FigmaRGBA);\n\t\t\t}\n\t\t\treturn String(value);\n\t\t}\n\t\tcase \"FLOAT\": {\n\t\t\tif (typeof value === \"number\") {\n\t\t\t\tif (useRem) {\n\t\t\t\t\treturn `${value / baseFontSize}rem`;\n\t\t\t\t}\n\t\t\t\treturn `${value}px`;\n\t\t\t}\n\t\t\treturn typeof value === \"string\" ? value : String(value);\n\t\t}\n\t\tcase \"BOOLEAN\": {\n\t\t\treturn Boolean(value);\n\t\t}\n\t\tcase \"STRING\":\n\t\tdefault: {\n\t\t\treturn String(value);\n\t\t}\n\t}\n}\n","import type {\n\tFigmaExportFormat,\n\tFigmaToStyleframeOptions,\n\tParsedVariable,\n\tParsedTheme,\n\tCodegenResult,\n\tFigmaVariableValue,\n\tFigmaRGBA,\n} from \"../types\";\nimport {\n\tfigmaToStyleframeName,\n\ttoVariableIdentifier,\n\textractCategory,\n} from \"./name-mapping\";\nimport { figmaValueToStyleframe } from \"./value-parsing\";\n\n/**\n * Known composable categories and their function names\n */\nconst COMPOSABLE_MAP: Record<string, string> = {\n\tcolor: \"useColor\",\n\tspacing: \"useSpacing\",\n\tfontSize: \"useFontSize\",\n\tfontWeight: \"useFontWeight\",\n\tfontFamily: \"useFontFamily\",\n\tlineHeight: \"useLineHeight\",\n\tletterSpacing: \"useLetterSpacing\",\n\tborderWidth: \"useBorderWidth\",\n\tborderRadius: \"useBorderRadius\",\n\tboxShadow: \"useBoxShadow\",\n};\n\n/**\n * Check if a value is a Figma variable alias\n */\nfunction isVariableAlias(\n\tvalue: FigmaVariableValue,\n): value is { type: \"VARIABLE_ALIAS\"; id: string } {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"type\" in value &&\n\t\tvalue.type === \"VARIABLE_ALIAS\"\n\t);\n}\n\n/**\n * Check if a value is a Figma RGBA color\n */\nfunction isFigmaColor(value: FigmaVariableValue): value is FigmaRGBA {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"r\" in value &&\n\t\t\"g\" in value &&\n\t\t\"b\" in value\n\t);\n}\n\n/**\n * Parse Figma export format into structured data for code generation\n */\nfunction parseVariables(\n\tdata: FigmaExportFormat,\n\toptions: FigmaToStyleframeOptions,\n): { variables: ParsedVariable[]; themes: ParsedTheme[] } {\n\tconst { useRem = false, baseFontSize = 16, defaultModeName } = options;\n\n\tconst defaultMode = defaultModeName || data.modes[0] || \"Default\";\n\tconst themeNames = data.modes.filter((m) => m !== defaultMode);\n\n\t// Build a map of variable ID to name for alias resolution\n\tconst nameMap = new Map<string, string>();\n\tfor (const v of data.variables) {\n\t\tnameMap.set(v.name, figmaToStyleframeName(v.name));\n\t}\n\n\tconst variables: ParsedVariable[] = [];\n\tconst themeVariablesMap = new Map<string, ParsedVariable[]>();\n\n\tfor (const themeName of themeNames) {\n\t\tthemeVariablesMap.set(themeName, []);\n\t}\n\n\tfor (const variable of data.variables) {\n\t\tconst styleframeName = figmaToStyleframeName(variable.name);\n\t\tconst category = extractCategory(styleframeName);\n\t\tconst defaultValue = variable.values[defaultMode];\n\n\t\tif (defaultValue === undefined) continue;\n\n\t\t// Determine type\n\t\tlet type: ParsedVariable[\"type\"] = \"string\";\n\t\tif (variable.type === \"COLOR\") type = \"color\";\n\t\telse if (variable.type === \"FLOAT\") type = \"number\";\n\t\telse if (variable.type === \"BOOLEAN\") type = \"boolean\";\n\n\t\t// Check if it's a reference\n\t\tconst isReference = isVariableAlias(defaultValue);\n\t\tlet referenceTo: string | undefined;\n\t\tlet value: string | number | boolean;\n\n\t\tif (isReference) {\n\t\t\t// For aliases, we need to find the target variable name\n\t\t\treferenceTo = variable.aliasTo\n\t\t\t\t? figmaToStyleframeName(variable.aliasTo)\n\t\t\t\t: undefined;\n\t\t\tvalue = \"\"; // Will be rendered as ref()\n\t\t} else if (isFigmaColor(defaultValue)) {\n\t\t\tvalue = figmaValueToStyleframe(\n\t\t\t\tdefaultValue,\n\t\t\t\t\"COLOR\",\n\t\t\t\tuseRem,\n\t\t\t\tbaseFontSize,\n\t\t\t) as string;\n\t\t} else if (typeof defaultValue === \"number\") {\n\t\t\tvalue = figmaValueToStyleframe(\n\t\t\t\tdefaultValue,\n\t\t\t\t\"FLOAT\",\n\t\t\t\tuseRem,\n\t\t\t\tbaseFontSize,\n\t\t\t) as string;\n\t\t} else if (typeof defaultValue === \"boolean\") {\n\t\t\tvalue = defaultValue;\n\t\t} else {\n\t\t\tvalue = String(defaultValue);\n\t\t}\n\n\t\tvariables.push({\n\t\t\tname: styleframeName,\n\t\t\tvalue,\n\t\t\ttype,\n\t\t\tcategory,\n\t\t\tisReference,\n\t\t\treferenceTo,\n\t\t});\n\n\t\t// Process theme overrides\n\t\tfor (const themeName of themeNames) {\n\t\t\tconst themeValue = variable.values[themeName];\n\t\t\tif (themeValue === undefined) continue;\n\n\t\t\t// Check if the value differs from default\n\t\t\tconst isThemeReference = isVariableAlias(themeValue);\n\t\t\tlet themeStyleframeValue: string | number | boolean;\n\n\t\t\tif (isThemeReference) {\n\t\t\t\tcontinue; // Skip theme references for now\n\t\t\t} else if (isFigmaColor(themeValue)) {\n\t\t\t\tthemeStyleframeValue = figmaValueToStyleframe(\n\t\t\t\t\tthemeValue,\n\t\t\t\t\t\"COLOR\",\n\t\t\t\t\tuseRem,\n\t\t\t\t\tbaseFontSize,\n\t\t\t\t) as string;\n\t\t\t} else if (typeof themeValue === \"number\") {\n\t\t\t\tthemeStyleframeValue = figmaValueToStyleframe(\n\t\t\t\t\tthemeValue,\n\t\t\t\t\t\"FLOAT\",\n\t\t\t\t\tuseRem,\n\t\t\t\t\tbaseFontSize,\n\t\t\t\t) as string;\n\t\t\t} else if (typeof themeValue === \"boolean\") {\n\t\t\t\tthemeStyleframeValue = themeValue;\n\t\t\t} else {\n\t\t\t\tthemeStyleframeValue = String(themeValue);\n\t\t\t}\n\n\t\t\t// Only add if different from default\n\t\t\tif (themeStyleframeValue !== value) {\n\t\t\t\tconst themeVariables = themeVariablesMap.get(themeName) || [];\n\t\t\t\tthemeVariables.push({\n\t\t\t\t\tname: styleframeName,\n\t\t\t\t\tvalue: themeStyleframeValue,\n\t\t\t\t\ttype,\n\t\t\t\t\tcategory,\n\t\t\t\t\tisReference: false,\n\t\t\t\t});\n\t\t\t\tthemeVariablesMap.set(themeName, themeVariables);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst themes: ParsedTheme[] = [];\n\tfor (const [name, vars] of themeVariablesMap) {\n\t\tif (vars.length > 0) {\n\t\t\tthemes.push({ name: name.toLowerCase(), variables: vars });\n\t\t}\n\t}\n\n\treturn { variables, themes };\n}\n\n/**\n * Group variables by category\n */\nfunction groupByCategory(\n\tvariables: ParsedVariable[],\n): Map<string, ParsedVariable[]> {\n\tconst groups = new Map<string, ParsedVariable[]>();\n\tfor (const v of variables) {\n\t\tconst existing = groups.get(v.category) || [];\n\t\texisting.push(v);\n\t\tgroups.set(v.category, existing);\n\t}\n\treturn groups;\n}\n\n/**\n * Generate code using composables\n */\nfunction generateComposableCode(\n\tcategory: string,\n\tvariables: ParsedVariable[],\n\tinstanceName: string,\n): { code: string; identifiers: string[]; composable: string } | null {\n\tconst composableName = COMPOSABLE_MAP[category];\n\tif (!composableName) return null;\n\n\t// Filter out references - composables don't handle them\n\tconst nonRefVars = variables.filter((v) => !v.isReference);\n\tif (nonRefVars.length === 0) return null;\n\n\tconst identifiers: string[] = [];\n\tconst valueEntries: string[] = [];\n\n\tfor (const v of nonRefVars) {\n\t\tconst key = v.name.split(\".\").slice(1).join(\".\") || v.name;\n\t\tconst identifier = toVariableIdentifier(v.name);\n\t\tidentifiers.push(identifier);\n\n\t\tconst valueStr =\n\t\t\ttypeof v.value === \"string\" ? `\"${v.value}\"` : String(v.value);\n\t\tvalueEntries.push(`\\t${key}: ${valueStr},`);\n\t}\n\n\tconst destructure = identifiers.join(\", \");\n\tconst code = `const { ${destructure} } = ${composableName}(${instanceName}, {\\n${valueEntries.join(\"\\n\")}\\n});`;\n\n\treturn { code, identifiers, composable: composableName };\n}\n\n/**\n * Generate variable declaration code\n * Returns null if the variable cannot be generated (e.g., reference with unknown target)\n */\nfunction generateVariableCode(variable: ParsedVariable): string | null {\n\tconst identifier = toVariableIdentifier(variable.name);\n\n\tif (variable.isReference) {\n\t\tif (variable.referenceTo) {\n\t\t\tconst refTarget = toVariableIdentifier(variable.referenceTo);\n\t\t\treturn `const ${identifier} = variable(\"${variable.name}\", ref(${refTarget}));`;\n\t\t}\n\t\t// Skip references with unknown targets - they can't be properly generated\n\t\treturn null;\n\t}\n\n\tconst valueStr =\n\t\ttypeof variable.value === \"string\"\n\t\t\t? `\"${variable.value}\"`\n\t\t\t: String(variable.value);\n\treturn `const ${identifier} = variable(\"${variable.name}\", ${valueStr});`;\n}\n\n/**\n * Generate theme block code\n */\nfunction generateThemeCode(theme: ParsedTheme, instanceName: string): string {\n\tconst lines: string[] = [];\n\tlines.push(`theme(\"${theme.name}\", (ctx) => {`);\n\n\tfor (const v of theme.variables) {\n\t\tconst identifier = toVariableIdentifier(v.name);\n\t\tconst valueStr =\n\t\t\ttypeof v.value === \"string\" ? `\"${v.value}\"` : String(v.value);\n\t\tlines.push(`\\tctx.variable(${identifier}, ${valueStr});`);\n\t}\n\n\tlines.push(\"});\");\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Generate Styleframe TypeScript code from Figma export format\n */\nexport function generateStyleframeCode(\n\tdata: FigmaExportFormat,\n\toptions: FigmaToStyleframeOptions = {},\n): CodegenResult {\n\tconst { useComposables = true, instanceName = \"s\" } = options;\n\n\tconst { variables, themes } = parseVariables(data, options);\n\tconst grouped = groupByCategory(variables);\n\tconst imports: string[] = [\"styleframe\"];\n\tconst usedComposables = new Set<string>();\n\tconst lines: string[] = [];\n\n\t// Generate variable declarations\n\tconst generatedIdentifiers = new Set<string>();\n\n\tfor (const [category, vars] of grouped) {\n\t\tlines.push(\n\t\t\t`\\n// ${category.charAt(0).toUpperCase() + category.slice(1)} variables`,\n\t\t);\n\n\t\tif (useComposables) {\n\t\t\tconst composableResult = generateComposableCode(\n\t\t\t\tcategory,\n\t\t\t\tvars,\n\t\t\t\tinstanceName,\n\t\t\t);\n\t\t\tif (composableResult) {\n\t\t\t\tlines.push(composableResult.code);\n\t\t\t\tusedComposables.add(composableResult.composable);\n\t\t\t\tfor (const id of composableResult.identifiers) {\n\t\t\t\t\tgeneratedIdentifiers.add(id);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Generate remaining variables (references or non-composable)\n\t\tfor (const v of vars) {\n\t\t\tconst identifier = toVariableIdentifier(v.name);\n\t\t\tif (generatedIdentifiers.has(identifier)) continue;\n\n\t\t\tif (!useComposables || v.isReference || !COMPOSABLE_MAP[category]) {\n\t\t\t\tconst code = generateVariableCode(v);\n\t\t\t\tif (code) {\n\t\t\t\t\tlines.push(code);\n\t\t\t\t\tgeneratedIdentifiers.add(identifier);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Generate theme blocks\n\tif (themes.length > 0) {\n\t\tlines.push(\"\");\n\t\tfor (const theme of themes) {\n\t\t\tlines.push(generateThemeCode(theme, instanceName));\n\t\t}\n\t}\n\n\t// Build final code\n\tconst composableImports = Array.from(usedComposables).sort();\n\n\tlet code = `import { styleframe } from \"styleframe\";\\n`;\n\tif (composableImports.length > 0) {\n\t\tcode += `import { ${composableImports.join(\", \")} } from \"@styleframe/theme\";\\n`;\n\t\timports.push(...composableImports);\n\t}\n\n\tcode += `\\nconst ${instanceName} = styleframe();\\n`;\n\tcode += `const { variable, ref, theme } = ${instanceName};\\n`;\n\tcode += lines.join(\"\\n\");\n\tcode += `\\n\\nexport default ${instanceName};\\n`;\n\n\treturn {\n\t\tcode,\n\t\tvariables,\n\t\tthemes,\n\t\timports,\n\t};\n}\n","/**\n * DTCG (Design Tokens Community Group) format types\n * Based on W3C Draft: https://www.designtokens.org/tr/drafts/format/\n */\n\n/**\n * DTCG token types as defined in W3C Draft\n */\nexport type DTCGTokenType =\n\t| \"color\"\n\t| \"dimension\"\n\t| \"fontFamily\"\n\t| \"fontWeight\"\n\t| \"duration\"\n\t| \"cubicBezier\"\n\t| \"number\"\n\t| \"string\";\n\n/**\n * DTCG alias reference (e.g., \"{color.primary}\")\n */\nexport type DTCGAliasValue = `{${string}}`;\n\n/**\n * Check if a value is a DTCG alias\n */\nexport function isDTCGAlias(value: unknown): value is DTCGAliasValue {\n\treturn (\n\t\ttypeof value === \"string\" && value.startsWith(\"{\") && value.endsWith(\"}\")\n\t);\n}\n\n/**\n * DTCG cubic bezier value\n */\nexport type DTCGCubicBezierValue = [number, number, number, number];\n\n/**\n * DTCG token value types\n */\nexport type DTCGTokenValue =\n\t| string\n\t| number\n\t| boolean\n\t| DTCGCubicBezierValue\n\t| DTCGAliasValue;\n\n/**\n * DTCG Modifier context - contains token overrides for a specific context\n * Token paths use dot notation (e.g., \"color.background\")\n */\nexport interface DTCGModifierContext {\n\t[tokenPath: string]: { $value: DTCGTokenValue } | DTCGModifierContext;\n}\n\n/**\n * DTCG Modifier definition\n * @see https://www.designtokens.org/tr/2025.10/\n */\nexport interface DTCGModifier {\n\t$type: \"modifier\";\n\t/** The default context name (optional) */\n\t$default?: string;\n\t/** Context definitions with token overrides */\n\tcontexts: Record<string, DTCGModifierContext>;\n}\n\n/**\n * DTCG Modifiers section at document root\n */\nexport interface DTCGModifiers {\n\ttheme?: DTCGModifier;\n\t[key: string]: DTCGModifier | undefined;\n}\n\n/**\n * Styleframe-specific extensions for DTCG format\n */\nexport interface DTCGStyleframeExtensions {\n\t/** Multi-mode values (key: mode name, value: token value) */\n\tmodes?: Record<string, DTCGTokenValue>;\n\t/** Original Styleframe variable name */\n\tstyleframeName?: string;\n}\n\n/**\n * Generic extensions object\n */\nexport interface DTCGExtensions {\n\t\"dev.styleframe\"?: DTCGStyleframeExtensions;\n\t[key: string]: unknown;\n}\n\n/**\n * Document-level Styleframe extensions\n */\nexport interface DTCGDocumentStyleframeExtensions {\n\t/** Collection name */\n\tcollection?: string;\n\t/** Mode names (first is default) */\n\tmodes?: string[];\n}\n\n/**\n * Document-level extensions\n */\nexport interface DTCGDocumentExtensions {\n\t\"dev.styleframe\"?: DTCGDocumentStyleframeExtensions;\n\t[key: string]: unknown;\n}\n\n/**\n * Base DTCG token interface\n */\nexport interface DTCGToken {\n\t$value: DTCGTokenValue;\n\t$type?: DTCGTokenType;\n\t$description?: string;\n\t$deprecated?: boolean | string;\n\t$extensions?: DTCGExtensions;\n}\n\n/**\n * DTCG group node (can contain tokens or nested groups)\n */\nexport interface DTCGGroup {\n\t$type?: DTCGTokenType;\n\t$description?: string;\n\t$extensions?: DTCGExtensions;\n\t[key: string]:\n\t\t| DTCGToken\n\t\t| DTCGGroup\n\t\t| DTCGTokenType\n\t\t| string\n\t\t| boolean\n\t\t| DTCGExtensions\n\t\t| undefined;\n}\n\n/**\n * Root DTCG document structure\n */\nexport interface DTCGDocument {\n\t$schema?: string;\n\t$description?: string;\n\t$extensions?: DTCGDocumentExtensions;\n\t$modifiers?: DTCGModifiers;\n\t[key: string]:\n\t\t| DTCGToken\n\t\t| DTCGGroup\n\t\t| DTCGModifiers\n\t\t| string\n\t\t| DTCGDocumentExtensions\n\t\t| undefined;\n}\n\n/**\n * Options for DTCG export\n */\nexport interface ToDTCGOptions {\n\t/** Include $schema field */\n\tincludeSchema?: boolean;\n\t/** DTCG schema URL */\n\tschemaUrl?: string;\n\t/** Use DTCG modifier format for multi-mode values (default: true) */\n\tuseModifiers?: boolean;\n\t/**\n\t * Theme names from Styleframe configuration.\n\t * When provided, only these modes will be used to generate $modifiers.theme.\n\t * If not provided, all non-default modes are treated as themes.\n\t */\n\tthemeNames?: string[];\n}\n\n/**\n * Options for DTCG import\n */\nexport interface FromDTCGOptions {\n\t/** Default mode name when no modes extension is present */\n\tdefaultModeName?: string;\n\t/** Collection name override */\n\tcollectionName?: string;\n\t/** Preferred modifier to use for modes if multiple exist (default: \"theme\") */\n\tpreferredModifier?: string;\n}\n\n/**\n * Type guard to check if a value is a DTCGToken (has $value property)\n */\nexport function isDTCGToken(value: unknown): value is DTCGToken {\n\treturn typeof value === \"object\" && value !== null && \"$value\" in value;\n}\n\n/**\n * Type guard to check if a value is a DTCGGroup (object without $value)\n */\nexport function isDTCGGroup(value: unknown): value is DTCGGroup {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t!(\"$value\" in value) &&\n\t\t!Array.isArray(value)\n\t);\n}\n","import type { FigmaVariableType } from \"../../types\";\nimport type { DTCGTokenType } from \"./types\";\n\n/**\n * Map Figma variable types to DTCG types\n */\nexport function figmaTypeToDTCG(figmaType: FigmaVariableType): DTCGTokenType {\n\tswitch (figmaType) {\n\t\tcase \"COLOR\":\n\t\t\treturn \"color\";\n\t\tcase \"FLOAT\":\n\t\t\treturn \"dimension\";\n\t\tcase \"STRING\":\n\t\t\treturn \"string\";\n\t\tcase \"BOOLEAN\":\n\t\t\treturn \"string\"; // DTCG has no boolean type\n\t\tdefault:\n\t\t\treturn \"string\";\n\t}\n}\n\n/**\n * Map DTCG types to Figma variable types\n */\nexport function dtcgTypeToFigma(dtcgType: DTCGTokenType): FigmaVariableType {\n\tswitch (dtcgType) {\n\t\tcase \"color\":\n\t\t\treturn \"COLOR\";\n\t\tcase \"dimension\":\n\t\tcase \"number\":\n\t\tcase \"fontWeight\":\n\t\tcase \"duration\":\n\t\t\treturn \"FLOAT\";\n\t\tcase \"fontFamily\":\n\t\tcase \"string\":\n\t\t\treturn \"STRING\";\n\t\tcase \"cubicBezier\":\n\t\t\treturn \"STRING\"; // Serialize as string\n\t\tdefault:\n\t\t\treturn \"STRING\";\n\t}\n}\n\n/**\n * Detect DTCG type from a value\n */\nexport function detectDTCGType(value: unknown): DTCGTokenType {\n\tif (typeof value === \"number\") return \"number\";\n\n\tif (typeof value === \"string\") {\n\t\t// Check for color formats\n\t\tif (\n\t\t\tvalue.startsWith(\"#\") ||\n\t\t\tvalue.startsWith(\"rgb\") ||\n\t\t\tvalue.startsWith(\"hsl\") ||\n\t\t\tvalue.startsWith(\"oklch\") ||\n\t\t\tvalue.startsWith(\"oklab\")\n\t\t) {\n\t\t\treturn \"color\";\n\t\t}\n\n\t\t// Check for dimension formats\n\t\tif (/^-?\\d*\\.?\\d+(px|rem|em|%|vh|vw|vmin|vmax|ch)$/.test(value)) {\n\t\t\treturn \"dimension\";\n\t\t}\n\n\t\t// Check for duration formats\n\t\tif (/^\\d*\\.?\\d+(ms|s)$/.test(value)) {\n\t\t\treturn \"duration\";\n\t\t}\n\t}\n\n\tif (Array.isArray(value) && value.length === 4) {\n\t\t// Could be cubic bezier\n\t\tif (value.every((v) => typeof v === \"number\")) {\n\t\t\treturn \"cubicBezier\";\n\t\t}\n\t}\n\n\treturn \"string\";\n}\n","import type { DTCGAliasValue } from \"./types\";\nimport { isDTCGAlias } from \"./types\";\n\n/**\n * Parse a DTCG alias string to get the referenced path\n * @example \"{color.primary}\" → \"color.primary\"\n */\nexport function parseAlias(alias: DTCGAliasValue): string {\n\treturn alias.slice(1, -1);\n}\n\n/**\n * Create a DTCG alias string from a token path\n * @example \"color.primary\" → \"{color.primary}\"\n */\nexport function createAlias(path: string): DTCGAliasValue {\n\t// Ensure path uses dot notation\n\tconst dotPath = path.replace(/\\//g, \".\");\n\treturn `{${dotPath}}` as DTCGAliasValue;\n}\n\n/**\n * Convert Figma slash notation to DTCG dot notation\n * @example \"color/primary\" → \"color.primary\"\n */\nexport function figmaPathToDTCG(figmaPath: string): string {\n\treturn figmaPath.replace(/\\//g, \".\");\n}\n\n/**\n * Convert DTCG dot notation to Figma slash notation\n * @example \"color.primary\" → \"color/primary\"\n */\nexport function dtcgPathToFigma(dtcgPath: string): string {\n\treturn dtcgPath.replace(/\\./g, \"/\");\n}\n\n/**\n * Check if a value is an alias and resolve it to Figma format\n */\nexport function resolveAliasForFigma(value: unknown): {\n\tisAlias: boolean;\n\ttarget?: string;\n} {\n\tif (isDTCGAlias(value)) {\n\t\tconst path = parseAlias(value);\n\t\treturn { isAlias: true, target: dtcgPathToFigma(path) };\n\t}\n\treturn { isAlias: false };\n}\n\n/**\n * Get the segments of a token path\n * @example \"color.primary.500\" → [\"color\", \"primary\", \"500\"]\n */\nexport function getPathSegments(path: string): string[] {\n\treturn path.split(/[./]/);\n}\n\n/**\n * Join path segments into a DTCG path\n * @example [\"color\", \"primary\", \"500\"] → \"color.primary.500\"\n */\nexport function joinPath(segments: string[]): string {\n\treturn segments.join(\".\");\n}\n","import type {\n\tFigmaExportFormat,\n\tFigmaExportVariable,\n\tFigmaRGBA,\n} from \"../../types\";\nimport type {\n\tDTCGDocument,\n\tDTCGToken,\n\tDTCGGroup,\n\tToDTCGOptions,\n\tDTCGTokenValue,\n\tDTCGModifierContext,\n} from \"./types\";\nimport { figmaTypeToDTCG } from \"./type-mapping\";\nimport { createAlias, figmaPathToDTCG, getPathSegments } from \"./alias-parsing\";\nimport { figmaColorToCss } from \"../value-parsing\";\n\nconst DTCG_SCHEMA_URL =\n\t\"https://design-tokens.github.io/community-group/format/\";\n\n/**\n * Convert FigmaExportFormat to DTCG format\n */\nexport function toDTCG(\n\tdata: FigmaExportFormat,\n\toptions: ToDTCGOptions = {},\n): DTCGDocument {\n\tconst {\n\t\tincludeSchema = true,\n\t\tschemaUrl = DTCG_SCHEMA_URL,\n\t\tuseModifiers = true,\n\t\tthemeNames,\n\t} = options;\n\n\tconst doc: DTCGDocument = {};\n\n\tif (includeSchema) {\n\t\tdoc.$schema = schemaUrl;\n\t}\n\n\t// Store collection and modes in extensions\n\tdoc.$extensions = {\n\t\t\"dev.styleframe\": {\n\t\t\tcollection: data.collection,\n\t\t\tmodes: data.modes,\n\t\t},\n\t};\n\n\tconst defaultMode = data.modes[0] || \"Default\";\n\n\t// Determine which modes are themes\n\t// If themeNames is provided, only use those modes as themes\n\t// Otherwise, all non-default modes are treated as themes\n\tconst themeModes = themeNames\n\t\t? data.modes.filter((m) => themeNames.includes(m) && m !== defaultMode)\n\t\t: data.modes.slice(1);\n\n\t// Track mode overrides for modifiers: Map<modeName, Map<tokenPath, value>>\n\tconst modeOverrides = new Map<string, Map<string, DTCGTokenValue>>();\n\tfor (const mode of themeModes) {\n\t\tmodeOverrides.set(mode, new Map());\n\t}\n\n\t// Build the token tree\n\tfor (const variable of data.variables) {\n\t\tconst { token, overrides } = variableToTokenWithOverrides(\n\t\t\tvariable,\n\t\t\tdata.modes,\n\t\t\tuseModifiers,\n\t\t\tthemeModes,\n\t\t);\n\t\tsetNestedToken(doc, variable.name, token);\n\n\t\t// Collect overrides for each theme mode (only when using modifiers)\n\t\tif (useModifiers) {\n\t\t\tfor (const [modeName, value] of overrides) {\n\t\t\t\tconst modeMap = modeOverrides.get(modeName);\n\t\t\t\tif (modeMap) {\n\t\t\t\t\tconst tokenPath = figmaPathToDTCG(variable.name);\n\t\t\t\t\tmodeMap.set(tokenPath, value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Generate $modifiers section if there are theme modes with overrides\n\tif (useModifiers && themeModes.length > 0 && hasAnyOverrides(modeOverrides)) {\n\t\tdoc.$modifiers = {\n\t\t\ttheme: {\n\t\t\t\t$type: \"modifier\",\n\t\t\t\tcontexts: buildModifierContexts(modeOverrides),\n\t\t\t},\n\t\t};\n\t}\n\n\treturn doc;\n}\n\n/**\n * Convert a single Figma variable to a DTCG token, returning overrides separately\n */\nfunction variableToTokenWithOverrides(\n\tvariable: FigmaExportVariable,\n\tmodes: string[],\n\tuseModifiers: boolean,\n\tthemeModes: string[],\n): { token: DTCGToken; overrides: Map<string, DTCGTokenValue> } {\n\tconst defaultMode = modes[0] || \"Default\";\n\tconst defaultValue = variable.values[defaultMode];\n\tconst dtcgType = figmaTypeToDTCG(variable.type);\n\tconst overrides = new Map<string, DTCGTokenValue>();\n\n\t// Handle alias\n\tif (variable.aliasTo) {\n\t\tconst token: DTCGToken = {\n\t\t\t$value: createAlias(variable.aliasTo),\n\t\t\t$type: dtcgType,\n\t\t};\n\n\t\tif (variable.description) {\n\t\t\ttoken.$description = variable.description;\n\t\t}\n\n\t\treturn { token, overrides };\n\t}\n\n\t// Convert the default value\n\tconst $value = convertValueToDTCG(defaultValue, variable.type);\n\n\tconst token: DTCGToken = {\n\t\t$value,\n\t\t$type: dtcgType,\n\t};\n\n\tif (variable.description) {\n\t\ttoken.$description = variable.description;\n\t}\n\n\t// Handle multi-mode values\n\tif (modes.length > 1) {\n\t\tconst modeValues: Record<string, DTCGTokenValue> = {};\n\t\tlet hasModeOverrides = false;\n\n\t\tfor (const mode of modes) {\n\t\t\tif (mode === defaultMode) continue;\n\n\t\t\tconst modeValue = variable.values[mode];\n\t\t\tif (modeValue !== undefined) {\n\t\t\t\tconst convertedValue = convertValueToDTCG(modeValue, variable.type);\n\n\t\t\t\t// Only include if value differs from default\n\t\t\t\tif (convertedValue !== $value) {\n\t\t\t\t\t// Check if this mode is a theme mode\n\t\t\t\t\tconst isThemeMode = themeModes.includes(mode);\n\n\t\t\t\t\tif (useModifiers && isThemeMode) {\n\t\t\t\t\t\t// Store in overrides map for $modifiers section\n\t\t\t\t\t\toverrides.set(mode, convertedValue);\n\t\t\t\t\t} else if (!useModifiers || !isThemeMode) {\n\t\t\t\t\t\t// Legacy: store in token extensions for non-theme modes\n\t\t\t\t\t\t// or when not using modifiers\n\t\t\t\t\t\tmodeValues[mode] = convertedValue;\n\t\t\t\t\t\thasModeOverrides = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Only add extensions if there are non-theme mode overrides\n\t\tif (hasModeOverrides) {\n\t\t\ttoken.$extensions = {\n\t\t\t\t\"dev.styleframe\": {\n\t\t\t\t\tmodes: modeValues,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\treturn { token, overrides };\n}\n\n/**\n * Convert a Figma value to DTCG format\n */\nfunction convertValueToDTCG(value: unknown, type: string): DTCGTokenValue {\n\t// Handle color values (FigmaRGBA)\n\tif (\n\t\ttype === \"COLOR\" &&\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"r\" in value\n\t) {\n\t\treturn figmaColorToCss(value as FigmaRGBA);\n\t}\n\n\t// Handle FLOAT values - convert to dimension string\n\tif (type === \"FLOAT\" && typeof value === \"number\") {\n\t\treturn `${value}px`;\n\t}\n\n\t// Handle boolean values - convert to string\n\tif (typeof value === \"boolean\") {\n\t\treturn value.toString();\n\t}\n\n\t// Default: return as string\n\treturn String(value);\n}\n\n/**\n * Set a token at a nested path in the document\n * @example \"color/primary\" creates { color: { primary: token } }\n */\nfunction setNestedToken(\n\tdoc: DTCGDocument,\n\tpath: string,\n\ttoken: DTCGToken,\n): void {\n\tconst segments = getPathSegments(path);\n\n\t// Navigate to the parent group, creating groups as needed\n\tlet current: DTCGGroup = doc as DTCGGroup;\n\n\tfor (let i = 0; i < segments.length - 1; i++) {\n\t\tconst segment = segments[i]!;\n\n\t\t// Skip reserved $ prefixed keys when checking\n\t\tif (!current[segment] || typeof current[segment] !== \"object\") {\n\t\t\tcurrent[segment] = {} as DTCGGroup;\n\t\t}\n\n\t\tcurrent = current[segment] as DTCGGroup;\n\t}\n\n\t// Set the token at the leaf\n\tconst leafKey = segments[segments.length - 1]!;\n\tcurrent[leafKey] = token;\n}\n\n/**\n * Check if any mode has overrides\n */\nfunction hasAnyOverrides(\n\tmodeOverrides: Map<string, Map<string, DTCGTokenValue>>,\n): boolean {\n\tfor (const overrides of modeOverrides.values()) {\n\t\tif (overrides.size > 0) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Build modifier contexts from collected overrides\n */\nfunction buildModifierContexts(\n\tmodeOverrides: Map<string, Map<string, DTCGTokenValue>>,\n): Record<string, DTCGModifierContext> {\n\tconst contexts: Record<string, DTCGModifierContext> = {};\n\n\tfor (const [modeName, tokenOverrides] of modeOverrides) {\n\t\tif (tokenOverrides.size === 0) continue;\n\n\t\tconst context: DTCGModifierContext = {};\n\t\tfor (const [tokenPath, value] of tokenOverrides) {\n\t\t\t// Set nested path in context (e.g., \"color.background\" -> { color: { background: { $value } } })\n\t\t\tsetNestedValue(context, tokenPath, { $value: value });\n\t\t}\n\t\tcontexts[modeName] = context;\n\t}\n\n\treturn contexts;\n}\n\n/**\n * Set a value at a nested path using dot notation\n */\nfunction setNestedValue(\n\tobj: DTCGModifierContext,\n\tpath: string,\n\tvalue: { $value: DTCGTokenValue },\n): void {\n\tconst segments = path.split(\".\");\n\tlet current = obj;\n\n\tfor (let i = 0; i < segments.length - 1; i++) {\n\t\tconst segment = segments[i]!;\n\t\tif (\n\t\t\t!current[segment] ||\n\t\t\ttypeof current[segment] !== \"object\" ||\n\t\t\t\"$value\" in current[segment]\n\t\t) {\n\t\t\tcurrent[segment] = {};\n\t\t}\n\t\tcurrent = current[segment] as DTCGModifierContext;\n\t}\n\n\tcurrent[segments[segments.length - 1]!] = value;\n}\n","import type {\n\tFigmaExportFormat,\n\tFigmaExportVariable,\n\tFigmaVariableType,\n\tFigmaRGBA,\n} from \"../../types\";\nimport type {\n\tDTCGDocument,\n\tDTCGToken,\n\tDTCGGroup,\n\tFromDTCGOptions,\n\tDTCGTokenType,\n\tDTCGTokenValue,\n\tDTCGAliasValue,\n\tDTCGModifierContext,\n} from \"./types\";\nimport { isDTCGToken, isDTCGGroup, isDTCGAlias } from \"./types\";\nimport { dtcgTypeToFigma } from \"./type-mapping\";\nimport { parseAlias, dtcgPathToFigma } from \"./alias-parsing\";\nimport { cssColorToFigma, dimensionToPixels } from \"../value-parsing\";\n\n/**\n * Convert DTCG format to FigmaExportFormat\n */\nexport function fromDTCG(\n\tdoc: DTCGDocument,\n\toptions: FromDTCGOptions = {},\n): FigmaExportFormat {\n\tconst {\n\t\tdefaultModeName = \"Default\",\n\t\tcollectionName,\n\t\tpreferredModifier = \"theme\",\n\t} = options;\n\n\t// Detect format and extract modes\n\tconst { modes } = extractModes(doc, defaultModeName, preferredModifier);\n\n\tconst sfExtension = doc.$extensions?.[\"dev.styleframe\"];\n\tconst collection =\n\t\tcollectionName || sfExtension?.collection || \"Design Tokens\";\n\n\tconst variables: FigmaExportVariable[] = [];\n\n\t// Extract modifier overrides if present\n\tconst modifierOverrides = extractModifierOverrides(doc, preferredModifier);\n\n\t// Walk the token tree\n\twalkTokens(\n\t\tdoc,\n\t\t\"\",\n\t\tmodes[0] || defaultModeName,\n\t\t(path, token, inheritedType) => {\n\t\t\tconst variable = tokenToVariableWithModifiers(\n\t\t\t\tpath,\n\t\t\t\ttoken,\n\t\t\t\tinheritedType,\n\t\t\t\tmodes,\n\t\t\t\tmodes[0] || defaultModeName,\n\t\t\t\tmodifierOverrides,\n\t\t\t);\n\t\t\tif (variable) {\n\t\t\t\tvariables.push(variable);\n\t\t\t}\n\t\t},\n\t);\n\n\treturn {\n\t\tcollection,\n\t\tmodes,\n\t\tvariables,\n\t};\n}\n\n/**\n * Walk all tokens in a DTCG document\n */\nfunction walkTokens(\n\tnode: DTCGGroup | DTCGDocument,\n\tparentPath: string,\n\tdefaultModeName: string,\n\tcallback: (\n\t\tpath: string,\n\t\ttoken: DTCGToken,\n\t\tinheritedType?: DTCGTokenType,\n\t) => void,\n\tinheritedType?: DTCGTokenType,\n): void {\n\tconst currentType = (node.$type as DTCGTokenType) || inheritedType;\n\n\tfor (const [key, value] of Object.entries(node)) {\n\t\t// Skip DTCG metadata properties\n\t\tif (key.startsWith(\"$\")) continue;\n\n\t\tconst path = parentPath ? `${parentPath}/${key}` : key;\n\n\t\tif (isDTCGToken(value)) {\n\t\t\tcallback(path, value, currentType);\n\t\t} else if (isDTCGGroup(value)) {\n\t\t\t// It's a group, recurse\n\t\t\twalkTokens(value, path, defaultModeName, callback, currentType);\n\t\t}\n\t}\n}\n\n/**\n * Extract modes from document, preferring modifiers over legacy format\n */\nfunction extractModes(\n\tdoc: DTCGDocument,\n\tdefaultModeName: string,\n\tpreferredModifier: string,\n): { modes: string[]; modeSource: \"modifier\" | \"extension\" | \"default\" } {\n\t// Check for modifier contexts first\n\tconst modifier = doc.$modifiers?.[preferredModifier];\n\tif (modifier && modifier.contexts) {\n\t\tconst contextNames = Object.keys(modifier.contexts);\n\t\tif (contextNames.length > 0) {\n\t\t\t// Get default mode from extension or use provided default\n\t\t\tconst sfExtension = doc.$extensions?.[\"dev.styleframe\"];\n\t\t\tconst defaultMode =\n\t\t\t\tmodifier.$default || sfExtension?.modes?.[0] || defaultModeName;\n\t\t\t// Combine default mode with context names (avoiding duplicates)\n\t\t\tconst allModes = [\n\t\t\t\tdefaultMode,\n\t\t\t\t...contextNames.filter((n) => n !== defaultMode),\n\t\t\t];\n\t\t\treturn { modes: allModes, modeSource: \"modifier\" };\n\t\t}\n\t}\n\n\t// Fall back to legacy extension format\n\tconst sfExtension = doc.$extensions?.[\"dev.styleframe\"];\n\tif (sfExtension?.modes && sfExtension.modes.length > 0) {\n\t\treturn { modes: sfExtension.modes, modeSource: \"extension\" };\n\t}\n\n\treturn { modes: [defaultModeName], modeSource: \"default\" };\n}\n\n/**\n * Extract all modifier overrides into a lookup map\n * Returns: Map<tokenPath, Map<contextName, value>>\n */\nfunction extractModifierOverrides(\n\tdoc: DTCGDocument,\n\tpreferredModifier: string,\n): Map<string, Map<string, DTCGTokenValue>> {\n\tconst overrides = new Map<string, Map<string, DTCGTokenValue>>();\n\n\tconst modifier = doc.$modifiers?.[preferredModifier];\n\tif (!modifier?.contexts) return overrides;\n\n\tfor (const [contextName, context] of Object.entries(modifier.contexts)) {\n\t\twalkModifierContext(context, \"\", (tokenPath, value) => {\n\t\t\tif (!overrides.has(tokenPath)) {\n\t\t\t\toverrides.set(tokenPath, new Map());\n\t\t\t}\n\t\t\toverrides.get(tokenPath)!.set(contextName, value);\n\t\t});\n\t}\n\n\treturn overrides;\n}\n\n/**\n * Walk a modifier context to extract token overrides\n */\nfunction walkModifierContext(\n\tcontext: DTCGModifierContext,\n\tparentPath: string,\n\tcallback: (tokenPath: string, value: DTCGTokenValue) => void,\n): void {\n\tfor (const [key, value] of Object.entries(context)) {\n\t\tconst path = parentPath ? `${parentPath}.${key}` : key;\n\n\t\tif (value && typeof value === \"object\" && \"$value\" in value) {\n\t\t\t// It's a token override\n\t\t\tcallback(path, value.$value as DTCGTokenValue);\n\t\t} else if (value && typeof value === \"object\") {\n\t\t\t// It's a nested group, recurse\n\t\t\twalkModifierContext(value as DTCGModifierContext, path, callback);\n\t\t}\n\t}\n}\n\n/**\n * Convert a DTCG token to FigmaExportVariable, applying modifier overrides\n */\nfunction tokenToVariableWithModifiers(\n\tpath: string,\n\ttoken: DTCGToken,\n\tinheritedType: DTCGTokenType | undefined,\n\tmodes: string[],\n\tdefaultModeName: string,\n\tmodifierOverrides: Map<string, Map<string, DTCGTokenValue>>,\n): FigmaExportVariable | null {\n\tconst type = token.$type || inheritedType || \"string\";\n\tconst figmaType = dtcgTypeToFigma(type);\n\n\t// Check for alias\n\tconst isAlias = isDTCGAlias(token.$value);\n\tlet aliasTo: string | undefined;\n\n\tconst values: Record<string, unknown> = {};\n\n\tif (isAlias) {\n\t\t// For aliases, store the resolved alias path\n\t\taliasTo = parseAlias(token.$value as DTCGAliasValue);\n\t\t// Still need to provide a placeholder value for the default mode\n\t\tvalues[defaultModeName] = {\n\t\t\ttype: \"VARIABLE_ALIAS\",\n\t\t\tid: dtcgPathToFigma(aliasTo),\n\t\t};\n\t} else {\n\t\t// Convert the default value\n\t\tconst defaultValue = convertValueToFigma(token.$value, figmaType);\n\t\tvalues[defaultModeName] = defaultValue;\n\n\t\t// Apply modifier overrides (preferred)\n\t\tconst tokenPath = path.replace(/\\//g, \".\");\n\t\tconst pathOverrides = modifierOverrides.get(tokenPath);\n\t\tif (pathOverrides) {\n\t\t\tfor (const [modeName, modeValue] of pathOverrides) {\n\t\t\t\tif (isDTCGAlias(modeValue)) {\n\t\t\t\t\tvalues[modeName] = {\n\t\t\t\t\t\ttype: \"VARIABLE_ALIAS\",\n\t\t\t\t\t\tid: dtcgPathToFigma(parseAlias(modeValue as DTCGAliasValue)),\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tvalues[modeName] = convertValueToFigma(modeValue, figmaType);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to legacy extension format if no modifier overrides\n\t\tif (!pathOverrides || pathOverrides.size === 0) {\n\t\t\tconst legacyModeOverrides = token.$extensions?.[\"dev.styleframe\"]?.modes;\n\t\t\tif (legacyModeOverrides) {\n\t\t\t\tfor (const [modeName, modeValue] of Object.entries(\n\t\t\t\t\tlegacyModeOverrides,\n\t\t\t\t)) {\n\t\t\t\t\tif (isDTCGAlias(modeValue)) {\n\t\t\t\t\t\tvalues[modeName] = {\n\t\t\t\t\t\t\ttype: \"VARIABLE_ALIAS\",\n\t\t\t\t\t\t\tid: dtcgPathToFigma(parseAlias(modeValue as DTCGAliasValue)),\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalues[modeName] = convertValueToFigma(modeValue, figmaType);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Convert path from slash to dot notation for styleframeName\n\tconst styleframeName = path.replace(/\\//g, \".\");\n\n\treturn {\n\t\tname: path, // Keep slash notation for Figma\n\t\tstyleframeName,\n\t\ttype: figmaType,\n\t\tvalues: values as FigmaExportVariable[\"values\"],\n\t\taliasTo,\n\t\tdescription: token.$description,\n\t};\n}\n\n/**\n * Convert a DTCG value to Figma format\n */\nfunction convertValueToFigma(\n\tvalue: DTCGTokenValue,\n\tfigmaType: FigmaVariableType,\n): FigmaRGBA | number | string | boolean {\n\t// Handle color values\n\tif (figmaType === \"COLOR\" && typeof value === \"string\") {\n\t\tconst rgba = cssColorToFigma(value);\n\t\tif (rgba) return rgba;\n\t}\n\n\t// Handle FLOAT values (dimensions)\n\tif (figmaType === \"FLOAT\") {\n\t\tif (typeof value === \"number\") return value;\n\t\tif (typeof value === \"string\") {\n\t\t\tconst pixels = dimensionToPixels(value);\n\t\t\tif (pixels !== null) return pixels;\n\t\t\t// Try parsing as a number\n\t\t\tconst num = Number.parseFloat(value);\n\t\t\tif (!Number.isNaN(num)) return num;\n\t\t}\n\t}\n\n\t// Handle boolean values\n\tif (figmaType === \"BOOLEAN\") {\n\t\tif (typeof value === \"boolean\") return value;\n\t\tif (value === \"true\") return true;\n\t\tif (value === \"false\") return false;\n\t}\n\n\t// Default: return as string\n\treturn String(value);\n}\n"],"mappings":"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"}
|