import { upperFirst } from 'lodash-es'; import { ConvertedOutput } from './convertTokens.js'; import { SpecifyDesignTokenTypeName } from '@specifyapp/specify-design-token-format'; function renderMap(input: { [name: string]: string }) { return Object.entries(input).reduce((acc, [name, value]) => { return acc + ` val ${name} = ${value}\n`; }, ''); } // When class name already exists, we prefix it function sanitizeType(name: SpecifyDesignTokenTypeName) { switch (name) { case 'color': case 'font': case 'fontWeight': case 'duration': case 'textStyle': return `${name}_`; default: return name; } } // We scope all tokens in a class to avoid name conflicts as everything can be renamed export function convertedToKotlin( input: ConvertedOutput, scopeName: string, androidMinVersion: number, ): string { return `import android.content.res.Resources${ androidMinVersion >= 34 ? '\nimport android.util.TypedValue\nimport android.util.TypedValue.COMPLEX_UNIT_SP' : '' } import androidx.compose.animation.core.CubicBezierEasing import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.* import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.sp object ${scopeName} { fun pxToDp(px: Double): Float { return (px / Resources.getSystem().displayMetrics.density).toFloat() } fun pxToDp(px: Int): Float { return px / Resources.getSystem().displayMetrics.density } fun pxToSp(px: Double): TextUnit { return ${ androidMinVersion >= 34 ? 'TypedValue.deriveDimension(COMPLEX_UNIT_SP, px.toFloat(), Resources.getSystem().displayMetrics).sp' : '(px / Resources.getSystem().displayMetrics.scaledDensity).sp' } } fun pxToSp(px: Int): TextUnit { return ${ androidMinVersion >= 34 ? 'TypedValue.deriveDimension(COMPLEX_UNIT_SP, px.toFloat(), Resources.getSystem().displayMetrics).sp' : '(px / Resources.getSystem().displayMetrics.scaledDensity).sp' } } ${Object.entries(input).reduce((acc, [type, map]) => { return ( acc + ` object ${upperFirst(sanitizeType(type as SpecifyDesignTokenTypeName))} {\n` + renderMap(map) + ' }\n\n' ); }, '')}}`; }