Handle switching state on first hover of button

This commit is contained in:
Jackson Harper 2024-02-29 10:55:48 +08:00
parent 9d5a90538a
commit efb5286efa
2 changed files with 19 additions and 22 deletions

View file

@ -6,7 +6,6 @@ import React from 'react'
import { MultiSelectMode } from '../../templates/homeFeed/LibraryHeader'
type HeaderCheckboxIconProps = {
color: string
multiSelectMode: MultiSelectMode
}
@ -16,20 +15,18 @@ export const HeaderCheckboxIcon = (
switch (props.multiSelectMode) {
case 'search':
case 'visible':
return <HeaderCheckboxCheckedIcon size={17} color={props.color} />
return <HeaderCheckboxCheckedIcon size={17} />
case 'none':
case 'off':
return <HeaderCheckboxUncheckedIcon size={17} color={props.color} />
return <HeaderCheckboxUncheckedIcon size={17} />
case 'some':
return <HeaderCheckboxHalfCheckedIcon size={17} color={props.color} />
return <HeaderCheckboxHalfCheckedIcon size={17} />
}
}
export class HeaderCheckboxUncheckedIcon extends React.Component<IconProps> {
render() {
const size = (this.props.size || 26).toString()
const color = this.props.color || 'white'
return (
<svg
width={size}
@ -57,8 +54,6 @@ export class HeaderCheckboxUncheckedIcon extends React.Component<IconProps> {
export class HeaderCheckboxCheckedIcon extends React.Component<IconProps> {
render() {
const size = (this.props.size || 26).toString()
const color = this.props.color || 'white'
return (
<svg
width={size}
@ -71,17 +66,17 @@ export class HeaderCheckboxCheckedIcon extends React.Component<IconProps> {
<path
d="M3.479 4.16667C3.479 3.72464 3.6546 3.30072 3.96716 2.98816C4.27972 2.67559 4.70364 2.5 5.14567 2.5H16.8123C17.2544 2.5 17.6783 2.67559 17.9908 2.98816C18.3034 3.30072 18.479 3.72464 18.479 4.16667V15.8333C18.479 16.2754 18.3034 16.6993 17.9908 17.0118C17.6783 17.3244 17.2544 17.5 16.8123 17.5H5.14567C4.70364 17.5 4.27972 17.3244 3.96716 17.0118C3.6546 16.6993 3.479 16.2754 3.479 15.8333V4.16667Z"
style={{
stroke: 'white',
stroke: 'var(--checkbox-color)',
}}
strokeWidth="1.25"
strokeLinecap="round"
strokeLinejoin="round"
/>
<g clip-path="url(#clip2_8938_4128)">
<g>
<path
d="M7.73877 10.0004L10.0536 12.3152L14.6832 7.68555"
style={{
stroke: 'white',
stroke: 'var(--checkbox-color)',
}}
strokeWidth="1.5"
strokeLinecap="round"
@ -97,8 +92,6 @@ export class HeaderCheckboxCheckedIcon extends React.Component<IconProps> {
export class HeaderCheckboxHalfCheckedIcon extends React.Component<IconProps> {
render() {
const size = (this.props.size || 26).toString()
const color = this.props.color || 'white'
return (
<svg
width={size}
@ -107,7 +100,7 @@ export class HeaderCheckboxHalfCheckedIcon extends React.Component<IconProps> {
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_8962_5484)">
<g>
<path
d="M3.479 4.16667C3.479 3.72464 3.6546 3.30072 3.96716 2.98816C4.27972 2.67559 4.70364 2.5 5.14567 2.5H16.8123C17.2544 2.5 17.6783 2.67559 17.9908 2.98816C18.3034 3.30072 18.479 3.72464 18.479 4.16667V15.8333C18.479 16.2754 18.3034 16.6993 17.9908 17.0118C17.6783 17.3244 17.2544 17.5 16.8123 17.5H5.14567C4.70364 17.5 4.27972 17.3244 3.96716 17.0118C3.6546 16.6993 3.479 16.2754 3.479 15.8333V4.16667Z"
style={{

View file

@ -161,10 +161,7 @@ const CheckBoxButton = (props: LibraryHeaderProps): JSX.Element => {
e.preventDefault()
}}
>
<HeaderCheckboxIcon
multiSelectMode={props.multiSelectMode}
color={color}
/>
<HeaderCheckboxIcon multiSelectMode={props.multiSelectMode} />
</Button>
)
}
@ -413,6 +410,8 @@ export function SearchBox(props: LibraryHeaderProps): JSX.Element {
function MultiSelectControls(props: LibraryHeaderProps): JSX.Element {
const [showConfirmDelete, setShowConfirmDelete] = useState(false)
const [showLabelsModal, setShowLabelsModal] = useState(false)
// Don't change on immediate hover, the button has to be blurred at least once
const [hoveredOut, setHoveredOut] = useState(false)
const compact = false
return (
@ -426,6 +425,10 @@ function MultiSelectControls(props: LibraryHeaderProps): JSX.Element {
boxShadow:
'0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06);',
}}
onMouseLeave={(event) => {
setHoveredOut(true)
event.preventDefault()
}}
>
<HStack
alignment="center"
@ -449,11 +452,12 @@ function MultiSelectControls(props: LibraryHeaderProps): JSX.Element {
bg: props.multiSelectMode !== 'off' ? '$ctaBlue' : 'transparent',
borderTopLeftRadius: '6px',
borderBottomLeftRadius: '6px',
'--checkbox-color': 'var(--colors-thLibraryMultiselectCheckbox)',
'--checkbox-color': 'white',
'&:hover': {
bg: '$thLibraryMultiselectHover',
'--checkbox-color':
'var(--colors-thLibraryMultiselectCheckboxHover)',
bg: hoveredOut ? '$thLibraryMultiselectHover' : '$ctaBlue',
'--checkbox-color': hoveredOut
? 'var(--colors-thLibraryMultiselectCheckboxHover)'
: 'white',
},
}}
>