Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/shiny-windows-find.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@cypress-design/react-menu': minor
'@cypress-design/vue-menu': minor
---

Prevent losing click event during icon replacement
66 changes: 45 additions & 21 deletions components/Menu/react/Menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ const IconComputed: React.FC<{
active?: boolean
animated?: boolean
Icon: NavMenuItemIcon
IconActive: NavMenuItemIconActive
IconActive?: NavMenuItemIconActive
interactiveColorsOnGroup?: boolean
}> = ({
active,
Expand All @@ -54,24 +54,48 @@ const IconComputed: React.FC<{
IconActive,
interactiveColorsOnGroup = true,
}) => {
return active ? (
<IconActive
animated={!!animated}
width="24"
height="24"
className={clsx(
'icon-dark-secondary-indigo-500 icon-light-indigo-300 icon-dark-indigo-400',
)}
/>
) : (
<Icon
size="24"
strokeColor="gray-600"
fillColor="gray-900"
secondaryFillColor="gray-900"
hoverStrokeColor="gray-400"
interactiveColorsOnGroup={interactiveColorsOnGroup}
/>
if (!IconActive) {
return (
<Icon
size="24"
strokeColor="gray-600"
fillColor="gray-900"
secondaryFillColor="gray-900"
hoverStrokeColor="gray-400"
interactiveColorsOnGroup={interactiveColorsOnGroup}
className={clsx({
'icon-dark-secondary-indigo-500 icon-light-indigo-300 icon-dark-indigo-400':
active,
})}
/>
)
}

return (
<span className="relative inline-flex w-[24px] h-[24px] shrink-0 items-center justify-center align-middle">
<Icon
size="24"
strokeColor="gray-600"
fillColor="gray-900"
secondaryFillColor="gray-900"
hoverStrokeColor="gray-400"
interactiveColorsOnGroup={interactiveColorsOnGroup}
className={clsx(
'absolute inset-0 transition-opacity',
active ? 'opacity-0' : 'opacity-100',
)}
/>
<IconActive
animated={!!animated}
width="24"
height="24"
className={clsx(
'absolute inset-0 transition-opacity',
active ? 'opacity-100' : 'opacity-0',
'icon-dark-secondary-indigo-500 icon-light-indigo-300 icon-dark-indigo-400',
)}
/>
</span>
)
}

Expand Down Expand Up @@ -115,13 +139,13 @@ const MenuItem = ({
onMouseUp={(e) => {
e.preventDefault()
setAnimated(true)
setTimeout(() => setTransientActive(false), 0)
setTransientActive(false)
}}
onMouseLeave={() => {
setTransientActive(false)
}}
>
{icon && iconActive ? (
{icon ? (
<IconComputed
Icon={icon}
IconActive={iconActive}
Expand Down
56 changes: 38 additions & 18 deletions components/Menu/vue/_MenuItem.vue
Original file line number Diff line number Diff line change
Expand Up @@ -61,24 +61,44 @@ const handleMouseLeave = () => {
@mouseup="handleMouseUp"
@mouseleave="handleMouseLeave"
>
<template v-if="icon && iconActive">
<IconActive
v-if="visuallyActive"
:animated="animated"
width="24"
height="24"
class="icon-dark-secondary-indigo-500 icon-light-indigo-300 icon-dark-indigo-400"
/>

<Icon
v-else
size="24"
strokeColor="gray-600"
fillColor="gray-900"
secondaryFillColor="gray-900"
hoverStrokeColor="gray-400"
interactiveColorsOnGroup
/>
<template v-if="icon">
<template v-if="iconActive">
<span
class="relative inline-flex w-[24px] h-[24px] shrink-0 items-center justify-center align-middle"
>
<Icon
v-show="!visuallyActive"
size="24"
strokeColor="gray-600"
fillColor="gray-900"
secondaryFillColor="gray-900"
hoverStrokeColor="gray-400"
interactiveColorsOnGroup
class="absolute inset-0 transition-opacity"
/>
<IconActive
v-show="visuallyActive"
:animated="animated"
width="24"
height="24"
class="absolute inset-0 transition-opacity icon-dark-secondary-indigo-500 icon-light-indigo-300 icon-dark-indigo-400"
/>
</span>
</template>
<template v-else>
<Icon
size="24"
strokeColor="gray-600"
fillColor="gray-900"
secondaryFillColor="gray-900"
hoverStrokeColor="gray-400"
interactiveColorsOnGroup
:class="{
'icon-dark-secondary-indigo-500 icon-light-indigo-300 icon-dark-indigo-400':
active,
}"
/>
</template>
</template>
{{ label }}
</a>
Expand Down
Loading