From 75c43d67249415aa6e9e238a9e1b16191eaf4067 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Wed, 29 Jul 2026 21:13:12 -0700 Subject: [PATCH] fix input clearable button styles --- .../autocomplete/autocomplete.module.css | 21 ++++++++++++ .../components/autocomplete/autocomplete.tsx | 12 ++++++- .../date-picker/date-picker.module.css | 21 ++++++++++++ .../components/date-picker/date-picker.tsx | 19 +++++++++-- .../date-time-picker.module.css | 21 ++++++++++++ .../date-time-picker/date-time-picker.tsx | 10 +++++- .../file-input/file-input.module.css | 21 ++++++++++++ .../components/file-input/file-input.tsx | 10 +++++- .../multi-select/multi-select.module.css | 17 ++++++++++ .../components/multi-select/multi-select.tsx | 31 +++++++++-------- .../components/select/select.module.css | 21 ++++++++++++ src/shared/components/select/select.tsx | 10 +++++- .../tags-input/tags-input.module.css | 17 ++++++++++ .../components/tags-input/tags-input.tsx | 33 ++++++++++--------- 14 files changed, 229 insertions(+), 35 deletions(-) diff --git a/src/shared/components/autocomplete/autocomplete.module.css b/src/shared/components/autocomplete/autocomplete.module.css index d3af24845..503140fde 100644 --- a/src/shared/components/autocomplete/autocomplete.module.css +++ b/src/shared/components/autocomplete/autocomplete.module.css @@ -17,6 +17,10 @@ color: var(--theme-colors-foreground); background: var(--theme-colors-background); } + + &.clearable { + padding-right: 4rem; + } } .input:focus, @@ -53,3 +57,20 @@ .option:hover { background: lighten(var(--theme-colors-surface), 5%); } + +.clear-button { + color: var(--theme-colors-foreground) !important; + background: transparent !important; + + &:hover, + &:active, + &:focus-visible { + @mixin dark { + background-color: lighten(var(--theme-colors-background), 10%) !important; + } + + @mixin light { + background-color: darken(var(--theme-colors-background), 5%) !important; + } + } +} diff --git a/src/shared/components/autocomplete/autocomplete.tsx b/src/shared/components/autocomplete/autocomplete.tsx index f932d7d4b..f58e7539f 100644 --- a/src/shared/components/autocomplete/autocomplete.tsx +++ b/src/shared/components/autocomplete/autocomplete.tsx @@ -1,6 +1,7 @@ import type { AutocompleteProps as MantineAutocompleteProps } from '@mantine/core'; import { Autocomplete as MantineAutocomplete } from '@mantine/core'; +import clsx from 'clsx'; import { CSSProperties, forwardRef } from 'react'; import styles from './autocomplete.module.css'; @@ -14,6 +15,7 @@ export const Autocomplete = forwardRef( ( { classNames, + clearable = false, maxWidth, size = 'sm', style, @@ -28,13 +30,21 @@ export const Autocomplete = forwardRef( classNames={{ description: styles.description, dropdown: styles.dropdown, - input: styles.input, + input: clsx(styles.input, { + [styles.clearable]: clearable, + }), label: styles.label, option: styles.option, root: styles.root, section: styles.section, ...classNames, }} + clearable={clearable} + clearButtonProps={{ + classNames: { + root: styles.clearButton, + }, + }} ref={ref} size={size} spellCheck={false} diff --git a/src/shared/components/date-picker/date-picker.module.css b/src/shared/components/date-picker/date-picker.module.css index 9d6ac450b..1e629a107 100644 --- a/src/shared/components/date-picker/date-picker.module.css +++ b/src/shared/components/date-picker/date-picker.module.css @@ -8,6 +8,10 @@ color: var(--theme-colors-surface-foreground); background: var(--theme-colors-surface); border: 1px solid transparent; + + &.clearable { + padding-right: 4rem; + } } .section { @@ -27,3 +31,20 @@ font-size: var(--theme-font-size-xs); color: var(--theme-colors-foreground-muted); } + +.clear-button { + color: var(--theme-colors-foreground) !important; + background: transparent !important; + + &:hover, + &:active, + &:focus-visible { + @mixin dark { + background-color: lighten(var(--theme-colors-background), 10%) !important; + } + + @mixin light { + background-color: darken(var(--theme-colors-background), 5%) !important; + } + } +} diff --git a/src/shared/components/date-picker/date-picker.tsx b/src/shared/components/date-picker/date-picker.tsx index b0058e359..64c2a8778 100644 --- a/src/shared/components/date-picker/date-picker.tsx +++ b/src/shared/components/date-picker/date-picker.tsx @@ -7,6 +7,7 @@ import { DateInput as MantineDateInput, DateTimePicker as MantineDateTimeInput, } from '@mantine/dates'; +import clsx from 'clsx'; import styles from './date-picker.module.css'; @@ -17,6 +18,7 @@ interface DateInputProps extends MantineDateInputProps { export const DateInput = ({ classNames, + clearable = false, maxWidth, size = 'sm', style, @@ -27,13 +29,19 @@ export const DateInput = ({ ( { children, classNames, + clearable = false, maxWidth, size = 'sm', style, @@ -29,7 +31,9 @@ export const FileInput = forwardRef( ( wrapper: styles.wrapper, ...classNames, }} + clearable={clearable} + clearButtonProps={{ + className: styles.clearButton, + }} ref={ref} size={size} style={{ maxWidth, width, ...style }} diff --git a/src/shared/components/multi-select/multi-select.module.css b/src/shared/components/multi-select/multi-select.module.css index 81fee220c..f156c9ce7 100644 --- a/src/shared/components/multi-select/multi-select.module.css +++ b/src/shared/components/multi-select/multi-select.module.css @@ -34,6 +34,10 @@ color: var(--theme-colors-foreground); background: var(--theme-colors-background); } + + &.clearable { + padding-right: 4rem; + } } .input:focus, @@ -75,5 +79,18 @@ } .clear-button { + color: var(--theme-colors-foreground) !important; background: transparent !important; + + &:hover, + &:active, + &:focus-visible { + @mixin dark { + background-color: lighten(var(--theme-colors-background), 10%) !important; + } + + @mixin light { + background-color: darken(var(--theme-colors-background), 5%) !important; + } + } } diff --git a/src/shared/components/multi-select/multi-select.tsx b/src/shared/components/multi-select/multi-select.tsx index 19d0c49d8..b0b341cca 100644 --- a/src/shared/components/multi-select/multi-select.tsx +++ b/src/shared/components/multi-select/multi-select.tsx @@ -2,6 +2,7 @@ import { MultiSelect as MantineMultiSelect, MultiSelectProps as MantineMultiSelectProps, } from '@mantine/core'; +import clsx from 'clsx'; import { CSSProperties, useMemo } from 'react'; import styles from './multi-select.module.css'; @@ -11,34 +12,35 @@ export interface MultiSelectProps extends MantineMultiSelectProps { width?: CSSProperties['width']; } -const defaultClassNames = { - description: styles.description, - dropdown: styles.dropdown, - input: styles.input, - label: styles.label, - option: styles.option, - pill: styles.pill, - pillsList: styles.pillsList, - root: styles.root, -}; - const defaultClearButtonProps = { classNames: { root: styles.clearButton, }, - variant: 'transparent' as const, }; export const MultiSelect = ({ classNames, + clearable = false, maxWidth, variant = 'default', width, ...props }: MultiSelectProps) => { const mergedClassNames = useMemo( - () => (classNames ? { ...defaultClassNames, ...classNames } : defaultClassNames), - [classNames], + () => ({ + description: styles.description, + dropdown: styles.dropdown, + input: clsx(styles.input, { + [styles.clearable]: clearable, + }), + label: styles.label, + option: styles.option, + pill: styles.pill, + pillsList: styles.pillsList, + root: styles.root, + ...classNames, + }), + [classNames, clearable], ); const style = useMemo( @@ -49,6 +51,7 @@ export const MultiSelect = ({ return ( { const mergedClassNames = useMemo( - () => (classNames ? { ...defaultClassNames, ...classNames } : defaultClassNames), - [classNames], + () => ({ + description: styles.description, + dropdown: styles.dropdown, + input: clsx(styles.input, { + [styles.clearable]: clearable, + }), + inputField: styles.inputField, + label: styles.label, + option: styles.option, + pill: styles.pill, + pillsList: styles.pillsList, + root: styles.root, + ...classNames, + }), + [classNames, clearable], ); const style = useMemo( @@ -50,6 +52,7 @@ export const TagsInput = ({ return (