From b8bfae3443535a8bfc594d82c245fbb0226a7705 Mon Sep 17 00:00:00 2001 From: Alcides Bezerra Date: Wed, 31 May 2023 11:20:52 -0300 Subject: [PATCH 1/2] tailwind-merge support --- src/components/DisabledItem.tsx | 10 +++--- src/components/GroupItem.tsx | 10 +++--- src/components/Item.tsx | 14 +++++--- src/components/Options.tsx | 6 ++-- src/components/SearchInput.tsx | 27 ++++++--------- src/components/Select.tsx | 59 +++++++++++++++------------------ 6 files changed, 58 insertions(+), 68 deletions(-) diff --git a/src/components/DisabledItem.tsx b/src/components/DisabledItem.tsx index e317328..d9d6ac7 100644 --- a/src/components/DisabledItem.tsx +++ b/src/components/DisabledItem.tsx @@ -1,4 +1,5 @@ import React, { useContext } from "react"; +import { twMerge } from "tailwind-merge"; import { SelectContext } from "./SelectProvider"; @@ -10,11 +11,10 @@ const DisabledItem: React.FC = ({ children }) => { const { classNames } = useContext(SelectContext); return (
{children}
diff --git a/src/components/GroupItem.tsx b/src/components/GroupItem.tsx index 84da5ee..174829d 100644 --- a/src/components/GroupItem.tsx +++ b/src/components/GroupItem.tsx @@ -1,4 +1,5 @@ import React from "react"; +import { twMerge } from "tailwind-merge"; import Item from "./Item"; import { useSelectContext } from "./SelectProvider"; @@ -20,11 +21,10 @@ const GroupItem: React.FC = ({ item, primaryColor }) => { <>{formatGroupLabel(item)} ) : (
{item.label}
diff --git a/src/components/Item.tsx b/src/components/Item.tsx index a27feb3..0c8a1c2 100755 --- a/src/components/Item.tsx +++ b/src/components/Item.tsx @@ -1,4 +1,5 @@ import React, { useCallback, useMemo } from "react"; +import { twMerge } from "tailwind-merge"; import { COLORS, DEFAULT_THEME, THEME_DATA } from "../constants"; @@ -46,9 +47,12 @@ const Item: React.FC = ({ item, primaryColor }) => { ? `text-white ${bgColor}` : `text-gray-500 ${bgHoverColor} ${textHoverColor}`; - return classNames && classNames.listItem - ? classNames.listItem({ isSelected }) - : `${baseClass} ${selectedClass}`; + const itemClass = twMerge( + classNames?.listItem?.({ isSelected }), + `${baseClass} ${selectedClass}` + ); + + return itemClass; }, [bgColor, bgHoverColor, classNames, isSelected, textHoverColor]); return ( @@ -65,8 +69,8 @@ const Item: React.FC = ({ item, primaryColor }) => {
  • ) => { - if (e.key === ' ' || e.key === 'Enter') { - handleValueChange(item) + if (e.key === " " || e.key === "Enter") { + handleValueChange(item); } }} aria-selected={isSelected} diff --git a/src/components/Options.tsx b/src/components/Options.tsx index 85e27d0..6a60e7b 100755 --- a/src/components/Options.tsx +++ b/src/components/Options.tsx @@ -1,4 +1,5 @@ import React, { useCallback, useContext, useMemo } from "react"; +import { twMerge } from "tailwind-merge"; import { DEFAULT_THEME } from "../constants"; @@ -92,10 +93,7 @@ const Options: React.FC = ({ }, [filterByText, removeValues]); return ( -
    +
    {filterResult.map((item, index) => ( {"options" in item ? ( diff --git a/src/components/SearchInput.tsx b/src/components/SearchInput.tsx index cce8e4f..d614c5c 100755 --- a/src/components/SearchInput.tsx +++ b/src/components/SearchInput.tsx @@ -1,4 +1,5 @@ import React, { forwardRef, useContext } from "react"; +import { twMerge } from "tailwind-merge"; import { SearchIcon } from "./Icons"; import { SelectContext } from "./SelectProvider"; @@ -16,27 +17,19 @@ const SearchInput = forwardRef(function Sear ) { const { classNames } = useContext(SelectContext); return ( -
    +
    = ({ : `bg-white hover:border-gray-400 ${borderFocus} focus:ring ${ringColor}` }`; - return classNames && classNames.menuButton - ? classNames.menuButton({ isDisabled }) - : defaultClass; + const selectClass = twMerge(defaultClass, classNames?.menuButton?.({ isDisabled })); + return selectClass; }, [classNames, isDisabled, primaryColor]); const getTagItemClass = useCallback( (item: Option) => { - const baseClasse = "bg-gray-200 border rounded-sm flex space-x-1"; + const baseClass = "bg-gray-200 border rounded-sm flex space-x-1"; const disabledClass = isDisabled ? "border-gray-500 px-1" : "pl-1"; - return classNames?.tagItem - ? classNames.tagItem({ item, isDisabled }) - : `${baseClasse} ${disabledClass}`; + const tagClass = twMerge( + `${baseClass} ${disabledClass}`, + classNames?.tagItem?.({ item, isDisabled }) + ); + + return tagClass; }, [classNames, isDisabled] ); @@ -196,11 +199,10 @@ const Select: React.FC = ({ value.map((item, index) => (

    {item.label}

    @@ -209,18 +211,16 @@ const Select: React.FC = ({ role="button" tabIndex={0} onClick={e => removeItem(e, item)} - className={ - classNames?.tagItemIconContainer - ? classNames.tagItemIconContainer - : "flex items-center px-1 cursor-pointer rounded-r-sm hover:bg-red-200 hover:text-red-600" - } + className={twMerge( + classNames?.tagItemIconContainer, + "flex items-center px-1 cursor-pointer rounded-r-sm hover:bg-red-200 hover:text-red-600" + )} >
    )} @@ -240,11 +240,7 @@ const Select: React.FC = ({ {isClearable && !isDisabled && value !== null && (
    )} @@ -265,11 +261,10 @@ const Select: React.FC = ({ {open && !isDisabled && (
    {isSearchable && ( Date: Wed, 31 May 2023 11:47:46 -0300 Subject: [PATCH 2/2] Fix twMerge arguments order --- package.json | 3 +++ src/components/DisabledItem.tsx | 4 ++-- src/components/GroupItem.tsx | 4 ++-- src/components/Item.tsx | 4 ++-- src/components/Options.tsx | 2 +- src/components/SearchInput.tsx | 10 +++++----- src/components/Select.tsx | 18 +++++++++--------- yarn.lock | 5 +++++ 8 files changed, 29 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 9a84ffb..8bd653b 100644 --- a/package.json +++ b/package.json @@ -65,5 +65,8 @@ "tailwindcss": "^3.1.7", "tslib": "^2.4.0", "typescript": "^4.8.4" + }, + "dependencies": { + "tailwind-merge": "^1.12.0" } } diff --git a/src/components/DisabledItem.tsx b/src/components/DisabledItem.tsx index d9d6ac7..3169b2b 100644 --- a/src/components/DisabledItem.tsx +++ b/src/components/DisabledItem.tsx @@ -12,8 +12,8 @@ const DisabledItem: React.FC = ({ children }) => { return (
    {children} diff --git a/src/components/GroupItem.tsx b/src/components/GroupItem.tsx index 174829d..dbb3313 100644 --- a/src/components/GroupItem.tsx +++ b/src/components/GroupItem.tsx @@ -22,8 +22,8 @@ const GroupItem: React.FC = ({ item, primaryColor }) => { ) : (
    {item.label} diff --git a/src/components/Item.tsx b/src/components/Item.tsx index 0c8a1c2..2e3a0e3 100755 --- a/src/components/Item.tsx +++ b/src/components/Item.tsx @@ -48,8 +48,8 @@ const Item: React.FC = ({ item, primaryColor }) => { : `text-gray-500 ${bgHoverColor} ${textHoverColor}`; const itemClass = twMerge( - classNames?.listItem?.({ isSelected }), - `${baseClass} ${selectedClass}` + `${baseClass} ${selectedClass}`, + classNames?.listItem?.({ isSelected }) ); return itemClass; diff --git a/src/components/Options.tsx b/src/components/Options.tsx index 6a60e7b..45c73b3 100755 --- a/src/components/Options.tsx +++ b/src/components/Options.tsx @@ -93,7 +93,7 @@ const Options: React.FC = ({ }, [filterByText, removeValues]); return ( -
    +
    {filterResult.map((item, index) => ( {"options" in item ? ( diff --git a/src/components/SearchInput.tsx b/src/components/SearchInput.tsx index d614c5c..25d41a9 100755 --- a/src/components/SearchInput.tsx +++ b/src/components/SearchInput.tsx @@ -17,18 +17,18 @@ const SearchInput = forwardRef(function Sear ) { const { classNames } = useContext(SelectContext); return ( -
    +
    = ({

    {item.label} @@ -212,14 +212,14 @@ const Select: React.FC = ({ tabIndex={0} onClick={e => removeItem(e, item)} className={twMerge( - classNames?.tagItemIconContainer, - "flex items-center px-1 cursor-pointer rounded-r-sm hover:bg-red-200 hover:text-red-600" + "flex items-center px-1 cursor-pointer rounded-r-sm hover:bg-red-200 hover:text-red-600", + classNames?.tagItemIconContainer )} >

    @@ -240,7 +240,7 @@ const Select: React.FC = ({ {isClearable && !isDisabled && value !== null && (
    )} @@ -262,8 +262,8 @@ const Select: React.FC = ({ {open && !isDisabled && (
    {isSearchable && ( diff --git a/yarn.lock b/yarn.lock index cd17f63..00b8166 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2366,6 +2366,11 @@ synckit@^0.8.4: "@pkgr/utils" "^2.3.1" tslib "^2.5.0" +tailwind-merge@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-1.12.0.tgz#747d09d64a25a4864150e8930f8e436866066cc8" + integrity sha512-Y17eDp7FtN1+JJ4OY0Bqv9OA41O+MS8c1Iyr3T6JFLnOgLg3EvcyMKZAnQ8AGyvB5Nxm3t9Xb5Mhe139m8QT/g== + tailwindcss@^3.1.7: version "3.2.7" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.7.tgz#5936dd08c250b05180f0944500c01dce19188c07"