/** @jsxImportSource nativewind */ /** * This file has some examples of unofficial plugins used by the community. * * They are not officially supported by NativeWind */ import { Text, View } from "react-native"; import flattenColorPalette from "tailwindcss/lib/util/flattenColorPalette"; import plugin from "tailwindcss/plugin"; import { render, screen } from "../test"; const testID = "nativewind"; test("tw-colors", async () => { const { createThemes } = require("tw-colors"); // Render will inject data await render( , { config: { plugins: [ createThemes( { light: { primary: "red", }, dark: { primary: "blue", }, }, { produceThemeClass: (themeName: string) => `theme-${themeName}`, }, ), ], }, }, ); expect(screen.getByTestId(testID)).toHaveStyle({ color: "hsla(0, 100%, 50%, 1)", }); screen.rerender( , ); expect(screen.getByTestId(testID)).toHaveStyle({ color: "hsla(240, 100%, 50%, 1)", }); }); test("text-shadow", async () => { const textShadowPlugin = plugin( function ({ addBase, matchUtilities, matchComponents, theme }: any) { addBase({ ":root": { "--ts-text-shadow-color": "rgba(0, 0,0,0.50)", "--ts-text-shadow-x": "1px", "--ts-text-shadow-y": "1px", "--ts-text-shadow-blur": "2px", }, }); matchUtilities( { [`text-shadow-x`]: (value: Record) => ({ "--ts-text-shadow-x": value, }), [`text-shadow-y`]: (value: Record) => ({ "--ts-text-shadow-y": value, }), [`text-shadow-blur`]: (value: Record) => ({ "--ts-text-shadow-blur": value, }), }, { values: theme("textShadowSteps"), type: "length", supportsNegativeValues: true, }, ); matchUtilities( { [`text-shadow`]: (value: Record) => ({ "--ts-text-shadow-color": value, }), }, { values: flattenColorPalette(theme("colors")), type: "color", }, ); matchComponents( { [`text-shadow`]: (value: number) => ({ textShadow: value === 1 ? `var(--ts-text-shadow-x) var(--ts-text-shadow-y) var(--ts-text-shadow-blur) var(--ts-text-shadow-color)` : `calc(var(--ts-text-shadow-x) * ${value}) calc(var(--ts-text-shadow-y) * ${value}) var(--ts-text-shadow-blur) var(--ts-text-shadow-color)`, }), }, { type: "number", values: theme("textShadowMultiplier"), }, ); }, { theme: { experimental: false, textShadowMultiplier: { DEFAULT: 1, sm: 4, md: 8, lg: 12, xl: 16, }, textShadowSteps: { xs: "1px", sm: "2px", md: "3px", lg: "4px", xl: "5px", 0: "0", 1: "1px", 2: "2px", 3: "3px", 4: "4px", 5: "5px", 6: "6px", 7: "7px", 8: "8px", 9: "9px", 10: "10px", }, }, }, ); await render( , { config: { plugins: [textShadowPlugin], }, }, ); const text = screen.getByTestId(testID); expect(text).toHaveStyle({ textShadowColor: "#ef4444", textShadowOffset: { height: 12, width: 12, }, textShadowRadius: 2, }); });