diff --git a/__tests__/tailwindcss/container.ts b/__tests__/tailwindcss/container.ts index e45ec87..a57524c 100644 --- a/__tests__/tailwindcss/container.ts +++ b/__tests__/tailwindcss/container.ts @@ -14,11 +14,11 @@ tailwindRunner("Layout - Container", [ }, media: { container: [ - { media: ["(min-width: 640px)"], suffix: 1 }, - { media: ["(min-width: 768px)"], suffix: 2 }, - { media: ["(min-width: 1024px)"], suffix: 3 }, - { media: ["(min-width: 1280px)"], suffix: 4 }, - { media: ["(min-width: 1536px)"], suffix: 5 }, + ["(min-width: 640px)", 1], + ["(min-width: 768px)", 2], + ["(min-width: 1024px)", 3], + ["(min-width: 1280px)", 4], + ["(min-width: 1536px)", 5], ], }, }, @@ -27,33 +27,21 @@ tailwindRunner("Layout - Container", [ "sm:container", { styles: { - "sm_container_0": { width: "100%" }, - "sm_container_1": { maxWidth: 640 }, - "sm_container_2": { maxWidth: 768 }, - "sm_container_3": { maxWidth: 1024 }, - "sm_container_4": { maxWidth: 1280 }, - "sm_container_5": { maxWidth: 1536 }, + sm_container_0: { width: "100%" }, + sm_container_1: { maxWidth: 640 }, + sm_container_2: { maxWidth: 768 }, + sm_container_3: { maxWidth: 1024 }, + sm_container_4: { maxWidth: 1280 }, + sm_container_5: { maxWidth: 1536 }, }, media: { - "sm_container": [ - { media: ["(min-width: 640px)"], suffix: 0 }, - { media: ["(min-width: 640px)"], suffix: 1 }, - { - media: ["(min-width: 640px)", "(min-width: 768px)"], - suffix: 2, - }, - { - media: ["(min-width: 640px)", "(min-width: 1024px)"], - suffix: 3, - }, - { - media: ["(min-width: 640px)", "(min-width: 1280px)"], - suffix: 4, - }, - { - media: ["(min-width: 640px)", "(min-width: 1536px)"], - suffix: 5, - }, + sm_container: [ + ["(min-width: 640px)", 0], + ["(min-width: 640px)", 1], + ["(min-width: 640px) and (min-width: 768px)", 2], + ["(min-width: 640px) and (min-width: 1024px)", 3], + ["(min-width: 640px) and (min-width: 1280px)", 4], + ["(min-width: 640px) and (min-width: 1536px)", 5], ], }, }, diff --git a/__tests__/tailwindcss/runner.ts b/__tests__/tailwindcss/runner.ts index cceb9ce..8faccce 100644 --- a/__tests__/tailwindcss/runner.ts +++ b/__tests__/tailwindcss/runner.ts @@ -1,7 +1,7 @@ -import { MediaRecord, StyleRecord } from "../../src/babel/types"; import { getNativeTailwindConfig } from "../../src/babel/tailwind/native-config"; import { extractStyles } from "../../src/babel/native-style-extraction"; import { normaliseSelector } from "../../src/shared/selector"; +import { MediaRecord, StyleRecord } from "../../src/types/common"; const nativeConfig = getNativeTailwindConfig(); diff --git a/__tests__/visitor/allow-modules/output.tsx b/__tests__/visitor/allow-modules/output.tsx index 6423f40..d33e8dc 100644 --- a/__tests__/visitor/allow-modules/output.tsx +++ b/__tests__/visitor/allow-modules/output.tsx @@ -43,25 +43,10 @@ Object.assign( ); Object.assign(globalThis.tailwindcss_react_native_media, { container: [ - { - media: ["(min-width: 640px)"], - suffix: 1, - }, - { - media: ["(min-width: 768px)"], - suffix: 2, - }, - { - media: ["(min-width: 1024px)"], - suffix: 3, - }, - { - media: ["(min-width: 1280px)"], - suffix: 4, - }, - { - media: ["(min-width: 1536px)"], - suffix: 5, - }, + ["(min-width: 640px)", 1], + ["(min-width: 768px)", 2], + ["(min-width: 1024px)", 3], + ["(min-width: 1280px)", 4], + ["(min-width: 1536px)", 5], ], }); diff --git a/__tests__/visitor/basic-tw/output.tsx b/__tests__/visitor/basic-tw/output.tsx index be598c8..a49e204 100644 --- a/__tests__/visitor/basic-tw/output.tsx +++ b/__tests__/visitor/basic-tw/output.tsx @@ -41,25 +41,10 @@ Object.assign( ); Object.assign(globalThis.tailwindcss_react_native_media, { container: [ - { - media: ["(min-width: 640px)"], - suffix: 1, - }, - { - media: ["(min-width: 768px)"], - suffix: 2, - }, - { - media: ["(min-width: 1024px)"], - suffix: 3, - }, - { - media: ["(min-width: 1280px)"], - suffix: 4, - }, - { - media: ["(min-width: 1536px)"], - suffix: 5, - }, + ["(min-width: 640px)", 1], + ["(min-width: 768px)", 2], + ["(min-width: 1024px)", 3], + ["(min-width: 1280px)", 4], + ["(min-width: 1536px)", 5], ], }); diff --git a/__tests__/visitor/basic/output.tsx b/__tests__/visitor/basic/output.tsx index 5d17286..4dca244 100644 --- a/__tests__/visitor/basic/output.tsx +++ b/__tests__/visitor/basic/output.tsx @@ -41,25 +41,10 @@ Object.assign( ); Object.assign(globalThis.tailwindcss_react_native_media, { container: [ - { - media: ["(min-width: 640px)"], - suffix: 1, - }, - { - media: ["(min-width: 768px)"], - suffix: 2, - }, - { - media: ["(min-width: 1024px)"], - suffix: 3, - }, - { - media: ["(min-width: 1280px)"], - suffix: 4, - }, - { - media: ["(min-width: 1536px)"], - suffix: 5, - }, + ["(min-width: 640px)", 1], + ["(min-width: 768px)", 2], + ["(min-width: 1024px)", 3], + ["(min-width: 1280px)", 4], + ["(min-width: 1536px)", 5], ], }); diff --git a/__tests__/visitor/skip-transform/output.tsx b/__tests__/visitor/skip-transform/output.tsx index c663d84..8fdf005 100644 --- a/__tests__/visitor/skip-transform/output.tsx +++ b/__tests__/visitor/skip-transform/output.tsx @@ -38,25 +38,10 @@ Object.assign( ); Object.assign(globalThis.tailwindcss_react_native_media, { container: [ - { - media: ["(min-width: 640px)"], - suffix: 1, - }, - { - media: ["(min-width: 768px)"], - suffix: 2, - }, - { - media: ["(min-width: 1024px)"], - suffix: 3, - }, - { - media: ["(min-width: 1280px)"], - suffix: 4, - }, - { - media: ["(min-width: 1536px)"], - suffix: 5, - }, + ["(min-width: 640px)", 1], + ["(min-width: 768px)", 2], + ["(min-width: 1024px)", 3], + ["(min-width: 1280px)", 4], + ["(min-width: 1536px)", 5], ], }); diff --git a/src/babel/native-style-extraction/get-parsed-rules.ts b/src/babel/native-style-extraction/get-parsed-rules.ts index aedc769..758ba5f 100644 --- a/src/babel/native-style-extraction/get-parsed-rules.ts +++ b/src/babel/native-style-extraction/get-parsed-rules.ts @@ -2,12 +2,12 @@ import { parse, AtRule, Comment, Media, Rule } from "css"; import { TailwindConfig } from "tailwindcss/tailwind-config"; import { normaliseSelector } from "../../shared/selector"; -import { Style } from "../types"; +import { Style } from "../../types/common"; import { ruleToReactNative } from "./rule-to-react-native"; interface CssRule { selector: string; - media: string[]; + media: string; style: Style; } @@ -51,7 +51,7 @@ function* cssRuleIterator( for (const selector of cssRule.selectors ?? []) { yield { selector: normaliseSelector(selector, tailwindConfig), - media, + media: media.join(" and "), style, }; } diff --git a/src/babel/native-style-extraction/index.ts b/src/babel/native-style-extraction/index.ts index 8377aed..c67dc27 100644 --- a/src/babel/native-style-extraction/index.ts +++ b/src/babel/native-style-extraction/index.ts @@ -1,12 +1,11 @@ -import { MediaRecord, StyleRecord } from "../types"; - +import { TailwindConfig } from "tailwindcss/tailwind-config"; import postcss from "postcss"; import tailwind from "tailwindcss"; import postcssCssvariables from "postcss-css-variables"; import postcssColorFunctionalNotation from "postcss-color-functional-notation"; import { getParsedRules } from "./get-parsed-rules"; -import { TailwindConfig } from "tailwindcss/tailwind-config"; +import { MediaRecord, StyleRecord } from "../../types/common"; export function extractStyles( tailwindConfig: TailwindConfig, @@ -36,7 +35,7 @@ export function cssToRn(processedCss: string, tailwindConfig: TailwindConfig) { styles[`${selector}_${suffix}`] = style; // Store the conditions, along with the suffix mediaRules[selector] = mediaRules[selector] ?? []; - mediaRules[selector].push({ media, suffix }); + mediaRules[selector].push([media, suffix]); } else { // If there are no conditions, we merge the rules styles[selector] = { diff --git a/src/babel/transforms/append-variables.ts b/src/babel/transforms/append-variables.ts index 7c1f59d..1dc786b 100644 --- a/src/babel/transforms/append-variables.ts +++ b/src/babel/transforms/append-variables.ts @@ -13,7 +13,7 @@ import { stringLiteral, unaryExpression, } from "@babel/types"; -import { MediaRecord, StyleRecord } from "../types"; +import { MediaRecord, StyleRecord } from "../../types/common"; import { globalMedia, globalStyle } from "./constants"; export function appendVariables( diff --git a/src/babel/types.d.ts b/src/babel/types.d.ts index e94032d..a9bc291 100644 --- a/src/babel/types.d.ts +++ b/src/babel/types.d.ts @@ -1,12 +1,5 @@ import { ViewStyle, TextStyle, ImageStyle } from "react-native"; -export type Style = ViewStyle | TextStyle | ImageStyle; -export type StyleRecord = Record; -export type MediaRecord = Record< - string, - Array<{ media: string[]; suffix: number }> ->; - export type PathOption = string; export type AllowPathOptions = "*" | PathOption[]; diff --git a/src/context.ts b/src/context.ts index 4c1b8f7..e30881d 100644 --- a/src/context.ts +++ b/src/context.ts @@ -1,25 +1,12 @@ import { createContext } from "react"; -import { - Appearance, - ColorSchemeName, - ImageStyle, - Platform, - TextStyle, - ViewStyle, -} from "react-native"; - -export type StyleRecord = Record; - -export type MediaRules = Record< - string, - Array<{ media: string[]; suffix: number }> ->; +import { Appearance, ColorSchemeName, Platform } from "react-native"; +import { MediaRecord, StyleRecord } from "./types/common"; declare global { // eslint-disable-next-line no-var var tailwindcss_react_native_style: StyleRecord; // eslint-disable-next-line no-var - var tailwindcss_react_native_media: MediaRules; + var tailwindcss_react_native_media: MediaRecord; } globalThis.tailwindcss_react_native_style ??= {}; @@ -28,7 +15,7 @@ globalThis.tailwindcss_react_native_media ??= {}; export const TailwindStyleContext = createContext( globalThis.tailwindcss_react_native_style ); -export const TailwindMediaContext = createContext( +export const TailwindMediaContext = createContext( globalThis.tailwindcss_react_native_media ); diff --git a/src/provider.tsx b/src/provider.tsx index 49f8738..44c2295 100644 --- a/src/provider.tsx +++ b/src/provider.tsx @@ -1,9 +1,9 @@ import { PropsWithChildren, useState } from "react"; import { ColorSchemeName, Appearance, Platform } from "react-native"; +import type { MediaRecord, StyleRecord } from "./types/common"; + import { - MediaRules, - StyleRecord, TailwindColorSchemeContext, TailwindMediaContext, TailwindPlatformContext, @@ -13,7 +13,7 @@ import { export interface TailwindProviderProps { styles?: StyleRecord; - media?: MediaRules; + media?: MediaRecord; colorScheme?: ColorSchemeName; platform?: typeof Platform.OS | "native"; } diff --git a/src/types/common.d.ts b/src/types/common.d.ts new file mode 100644 index 0000000..df1cf29 --- /dev/null +++ b/src/types/common.d.ts @@ -0,0 +1,10 @@ +import type { + ImageStyle, + TextStyle, + ViewStyle, +} from "react-native"; + +export type Style = ViewStyle | TextStyle | ImageStyle; +export type StyleRecord = Record; +export type Media = [string, number]; +export type MediaRecord = Record; diff --git a/src/use-tailwind.ts b/src/use-tailwind.ts index 18cd976..d5a11de 100644 --- a/src/use-tailwind.ts +++ b/src/use-tailwind.ts @@ -15,10 +15,7 @@ import { TailwindPlatformContext, TailwindStyleContext, } from "./context"; -import { - // useAccessibilityInfo, - useDeviceOrientation, -} from "@react-native-community/hooks"; +import { useDeviceOrientation } from "@react-native-community/hooks"; export function useTailwind< // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -43,7 +40,7 @@ export function useTailwind< const mediaRules = useContext(TailwindMediaContext); const colorScheme = useContext(TailwindColorSchemeContext); const { width, height } = useWindowDimensions(); - // const { reduceMotionEnabled: reduceMotion } = useAccessibilityInfo() + // const { reduceMotionEnabled: reduceMotion } = useAccessibilityInfo() // We should support this const orientation = useDeviceOrientation().portrait ? "portrait" : "landscape"; @@ -57,21 +54,19 @@ export function useTailwind< tailwindStyleIds.push(styles[selector] as P); } - for (const { media, suffix } of mediaRules[selector] ?? []) { - if (!media) { - tailwindStyleIds.push(styles[`${className}_${suffix}`] as P); - continue; - } - - const isMatch = matchMediaQuery(media.join(" and "), { + for (const [media, suffix] of mediaRules[selector] ?? []) { + const isMatch = matchMediaQuery(media, { width, + "device-width": width, + "device-height": width, height, orientation, + "prefers-color-scheme": colorScheme, }); if (isMatch) { - tailwindStyleIds.push(styles[`${selector}${suffix}`] as P); + tailwindStyleIds.push(styles[`${selector}_${suffix}`] as P); } } }