diff --git a/apps/expo-example/metro.config.js b/apps/expo-example/metro.config.js index 48556619..848e2842 100644 --- a/apps/expo-example/metro.config.js +++ b/apps/expo-example/metro.config.js @@ -17,5 +17,5 @@ module.exports = (async () => { path.join(workspaceRoot, 'node_modules'), ] - return withUniwindConfig(config, { cssEntryFile: 'global.css', extraThemes: ['premium'] }) + return withUniwindConfig(config, { cssEntryFile: 'global.css', extraThemes: ['premium'], polyfills: { rem: 14 } }) })() diff --git a/packages/uniwind/src/metro/compileVirtual.ts b/packages/uniwind/src/metro/compileVirtual.ts index 9ccb60c1..77beb7d3 100644 --- a/packages/uniwind/src/metro/compileVirtual.ts +++ b/packages/uniwind/src/metro/compileVirtual.ts @@ -2,7 +2,7 @@ import { compile } from '@tailwindcss/node' import { polyfillWeb } from './polyfillWeb' import { ProcessorBuilder } from './processor' import { addMetaToStylesTemplate, serializeStylesheet } from './stylesheet' -import { Platform } from './types' +import { Platform, Polyfills } from './types' type CompileVirtualConfig = { cssPath: string @@ -10,9 +10,10 @@ type CompileVirtualConfig = { candidates: Array platform: Platform themes: Array + polyfills: Polyfills | undefined } -export const compileVirtual = async ({ candidates, css, cssPath, platform, themes }: CompileVirtualConfig) => { +export const compileVirtual = async ({ candidates, css, cssPath, platform, themes, polyfills }: CompileVirtualConfig) => { const compiler = await compile(css, { base: cssPath, onDependency: () => void 0, @@ -23,7 +24,7 @@ export const compileVirtual = async ({ candidates, css, cssPath, platform, theme return polyfillWeb(tailwindCSS) } - const Processor = new ProcessorBuilder(themes) + const Processor = new ProcessorBuilder(themes, polyfills) Processor.transform(tailwindCSS) diff --git a/packages/uniwind/src/metro/index.d.ts b/packages/uniwind/src/metro/index.d.ts index bce464d6..76c84a6c 100644 --- a/packages/uniwind/src/metro/index.d.ts +++ b/packages/uniwind/src/metro/index.d.ts @@ -1,9 +1,14 @@ import type { MetroConfig } from 'metro-config' +type Polyfills = { + rem?: number +} + type UniwindConfig = { cssEntryFile: string extraThemes?: Array dtsFile?: string + polyfills?: Polyfills } export declare function withUniwindConfig(config: MetroConfig, options: UniwindConfig): MetroConfig diff --git a/packages/uniwind/src/metro/processor/processor.ts b/packages/uniwind/src/metro/processor/processor.ts index 3fc0f70e..3d9471cf 100644 --- a/packages/uniwind/src/metro/processor/processor.ts +++ b/packages/uniwind/src/metro/processor/processor.ts @@ -1,4 +1,5 @@ import { Declaration, MediaQuery, Rule, transform } from 'lightningcss' +import { Polyfills } from '../types' import { Color } from './color' import { CSS } from './css' import { Functions } from './functions' @@ -9,9 +10,7 @@ import { Var } from './var' export class ProcessorBuilder { stylesheets = {} as Record> - vars = { - '--uniwind-em': 16, - } as Record + vars = {} as Record CSS = new CSS(this) RN = new RN(this) Var = new Var(this) @@ -22,7 +21,9 @@ export class ProcessorBuilder { private declarationConfig = this.getDeclarationConfig() - constructor(private readonly themes: Array) {} + constructor(private readonly themes: Array, readonly polyfills: Polyfills | undefined) { + this.vars['--uniwind-em'] = polyfills?.rem ?? 16 + } transform(css: string) { transform({ diff --git a/packages/uniwind/src/metro/processor/units.ts b/packages/uniwind/src/metro/processor/units.ts index 4a16f045..0af2f926 100644 --- a/packages/uniwind/src/metro/processor/units.ts +++ b/packages/uniwind/src/metro/processor/units.ts @@ -21,7 +21,7 @@ export class Units { case 'vh': return `rt.screen.height * ${length.value / 100}` case 'rem': - return length.value * 16 + return length.value * this.Processor.vars['--uniwind-em'] case 'em': return `this[\`--uniwind-em\`] * ${length.value}` default: diff --git a/packages/uniwind/src/metro/types.ts b/packages/uniwind/src/metro/types.ts index 096b920e..a867b565 100644 --- a/packages/uniwind/src/metro/types.ts +++ b/packages/uniwind/src/metro/types.ts @@ -25,11 +25,16 @@ export type ExtendedFileSystem = { getSha1: WithUniwindPatch<(filename: string) => string> } +export type Polyfills = { + rem?: number +} + export type UniwindConfig = { cssEntryFile: string themes: Array extraThemes?: Array dtsFile?: string + polyfills?: Polyfills } export type MediaQueryResolver = { diff --git a/packages/uniwind/src/metro/withUniwindConfig.ts b/packages/uniwind/src/metro/withUniwindConfig.ts index cd89a552..91e91c03 100644 --- a/packages/uniwind/src/metro/withUniwindConfig.ts +++ b/packages/uniwind/src/metro/withUniwindConfig.ts @@ -132,6 +132,7 @@ export const withUniwindConfig = ( css: uniwind.cssFile, platform, themes: uniwindConfig.themes, + polyfills: uniwindConfig.polyfills, }) uniwind.virtualModules.set(getVirtualPath(platform), virtualFile)