diff --git a/__tests__/tailwindcss/pseudo-classes.ts b/__tests__/tailwindcss/pseudo-classes.ts new file mode 100644 index 0000000..48f5139 --- /dev/null +++ b/__tests__/tailwindcss/pseudo-classes.ts @@ -0,0 +1,28 @@ +import { tailwindRunner } from "./runner"; + +tailwindRunner("Pseudo-classes - hover", [ + [ + "hover:text-green-500", + { + "hover_text-green-500": [ + { atRules: [["pseudo-class", "hover"]], color: "#22c55e" }, + ], + }, + ], + [ + "focus:text-green-500", + { + "focus_text-green-500": [ + { atRules: [["pseudo-class", "focus"]], color: "#22c55e" }, + ], + }, + ], + [ + "active:text-green-500", + { + "active_text-green-500": [ + { atRules: [["pseudo-class", "active"]], color: "#22c55e" }, + ], + }, + ], +]); diff --git a/__tests__/tailwindcss/runner/index.ts b/__tests__/tailwindcss/runner/index.ts index ee2931c..d12cbed 100644 --- a/__tests__/tailwindcss/runner/index.ts +++ b/__tests__/tailwindcss/runner/index.ts @@ -2,8 +2,8 @@ import { TailwindConfig } from "tailwindcss/tailwind-config"; import { extractStyles } from "../../../src/postcss/extract-styles"; import { StyleError, StyleRecord } from "../../../src/types/common"; -import plugin from "../../../src/plugin"; -import { nativePlugin } from "../../../src/plugin/native"; +import plugin from "../../../src/tailwind"; +import { nativePlugin } from "../../../src/tailwind/native"; export type Test = [string, StyleRecord] | [string, StyleRecord, true]; diff --git a/src/babel/utils/get-tailwind-config.ts b/src/babel/utils/get-tailwind-config.ts index bd3f2d6..6f12e29 100644 --- a/src/babel/utils/get-tailwind-config.ts +++ b/src/babel/utils/get-tailwind-config.ts @@ -4,7 +4,7 @@ import { existsSync } from "node:fs"; import resolveTailwindConfig from "tailwindcss/resolveConfig"; import { TailwindConfig } from "tailwindcss/tailwind-config"; -import { nativePlugin, NativePluginOptions } from "../../plugin/native"; +import { nativePlugin, NativePluginOptions } from "../../tailwind/native"; export interface GetTailwindConfigOptions extends NativePluginOptions { tailwindConfigPath?: string; diff --git a/src/styled.tsx b/src/styled.tsx index 9758cae..9acd85c 100644 --- a/src/styled.tsx +++ b/src/styled.tsx @@ -10,6 +10,7 @@ import { ImageStyle, StyleProp, TextStyle, ViewStyle } from "react-native"; import { useTailwind } from "./use-tailwind"; import { ChildClassNameSymbol } from "./utils/child-styles"; import { isFragment } from "react-is"; +import { useInteraction } from "./use-interaction"; type StyledProps
= PropsWithChildren< P & { @@ -35,8 +36,13 @@ export function styled
( children: componentChildren, ...props }: StyledProps
) { + const { hover, focus, active, ...handlers } = useInteraction(props); + const tailwindStyles = useTailwind({ nthChild, + hover, + focus, + active, [ChildClassNameSymbol]: inheritedClassName, })(tw ?? className); @@ -60,6 +66,7 @@ export function styled
(
return createElement(Component, {
...props,
+ ...handlers,
style,
children,
} as unknown as P);
diff --git a/src/plugin/LICENSE b/src/tailwind/LICENSE
similarity index 100%
rename from src/plugin/LICENSE
rename to src/tailwind/LICENSE
diff --git a/src/plugin/index.ts b/src/tailwind/index.ts
similarity index 100%
rename from src/plugin/index.ts
rename to src/tailwind/index.ts
diff --git a/src/plugin/native/box-shadow.ts b/src/tailwind/native/box-shadow.ts
similarity index 100%
rename from src/plugin/native/box-shadow.ts
rename to src/tailwind/native/box-shadow.ts
diff --git a/src/plugin/native/divide.ts b/src/tailwind/native/divide.ts
similarity index 100%
rename from src/plugin/native/divide.ts
rename to src/tailwind/native/divide.ts
diff --git a/src/plugin/native/elevation.ts b/src/tailwind/native/elevation.ts
similarity index 100%
rename from src/plugin/native/elevation.ts
rename to src/tailwind/native/elevation.ts
diff --git a/src/plugin/native/font-size.ts b/src/tailwind/native/font-size.ts
similarity index 100%
rename from src/plugin/native/font-size.ts
rename to src/tailwind/native/font-size.ts
diff --git a/src/plugin/native/gap.ts b/src/tailwind/native/gap.ts
similarity index 100%
rename from src/plugin/native/gap.ts
rename to src/tailwind/native/gap.ts
diff --git a/src/plugin/native/index.ts b/src/tailwind/native/index.ts
similarity index 98%
rename from src/plugin/native/index.ts
rename to src/tailwind/native/index.ts
index 4b5bf51..fb2a916 100644
--- a/src/plugin/native/index.ts
+++ b/src/tailwind/native/index.ts
@@ -10,6 +10,7 @@ import { elevation } from "./elevation";
import { fontSize } from "./font-size";
import { gap } from "./gap";
import { lineHeight } from "./line-height";
+import { pseudoClasses } from "./pseudo-classes";
import { rotate } from "./rotate";
import { scale } from "./scale";
import { skew } from "./skew";
@@ -46,6 +47,7 @@ export const nativePlugin = plugin.withOptions (
* White space for visual clarity :)
*/
export function useTailwind ({
+ hover,
+ focus,
+ active,
[ChildClassNameSymbol]: inheritedClassNames = "",
nthChild: initialNthChild = 0,
}: UseTailwindOptions = {}) {
@@ -90,9 +93,13 @@ export function useTailwind ({
if (rule === "selector" && params === "(> * + *)") {
isForChildren = !name.startsWith(">");
return nthChild > 1;
- }
-
- if (rule === "media") {
+ } else if (rule === "pseudo-class" && params === "hover") {
+ return hover;
+ } else if (rule === "pseudo-class" && params === "focus") {
+ return focus;
+ } else if (rule === "pseudo-class" && params === "active") {
+ return active;
+ } else if (rule === "media") {
return match(params, {
"aspect-ratio": width / height,
"device-aspect-ratio": width / height,
diff --git a/src/use-tailwind.ts b/src/use-tailwind.ts
index 2ce3bcf..93733c2 100644
--- a/src/use-tailwind.ts
+++ b/src/use-tailwind.ts
@@ -15,5 +15,8 @@ export type UseTailwindCallback = (className?: string) => StyleProp &
export interface UseTailwindOptions {
nthChild?: number;
+ hover?: boolean;
+ focus?: boolean;
+ active?: boolean;
[ChildClassNameSymbol]?: string;
}