mirror of
https://github.com/jeffvli/feishin.git
synced 2026-07-21 18:06:30 +02:00
add TagsInput component
This commit is contained in:
@@ -0,0 +1,66 @@
|
|||||||
|
.root {
|
||||||
|
& [data-disabled='true'] {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
margin-bottom: var(--theme-spacing-sm);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown {
|
||||||
|
padding: var(--theme-spacing-xs);
|
||||||
|
color: var(--theme-colors-surface-foreground);
|
||||||
|
background: var(--theme-colors-surface);
|
||||||
|
border: 1px solid var(--theme-colors-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.input {
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
|
||||||
|
&[data-variant='default'] {
|
||||||
|
color: var(--theme-colors-surface-foreground);
|
||||||
|
background: var(--theme-colors-surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-variant='filled'] {
|
||||||
|
color: var(--theme-colors-foreground);
|
||||||
|
background: var(--theme-colors-background);
|
||||||
|
|
||||||
|
& .pill {
|
||||||
|
background: var(--theme-colors-surface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.input:focus-within {
|
||||||
|
border-color: lighten(var(--theme-colors-border), 10%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-field {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.option {
|
||||||
|
position: relative;
|
||||||
|
padding: var(--theme-spacing-sm) var(--theme-spacing-md);
|
||||||
|
}
|
||||||
|
|
||||||
|
.option:hover {
|
||||||
|
background: lighten(var(--theme-colors-surface), 5%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pill {
|
||||||
|
font-size: var(--theme-font-size-sm);
|
||||||
|
background: var(--theme-colors-background);
|
||||||
|
border-radius: var(--theme-radius-sm);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pills-list {
|
||||||
|
padding-right: var(--theme-spacing-lg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.clear-button {
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
import {
|
||||||
|
TagsInput as MantineTagsInput,
|
||||||
|
TagsInputProps as MantineTagsInputProps,
|
||||||
|
} from '@mantine/core';
|
||||||
|
import { CSSProperties, useMemo } from 'react';
|
||||||
|
|
||||||
|
import styles from './tags-input.module.css';
|
||||||
|
|
||||||
|
export interface TagsInputProps extends MantineTagsInputProps {
|
||||||
|
maxWidth?: CSSProperties['maxWidth'];
|
||||||
|
width?: CSSProperties['width'];
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultClassNames = {
|
||||||
|
dropdown: styles.dropdown,
|
||||||
|
input: styles.input,
|
||||||
|
inputField: styles.inputField,
|
||||||
|
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 TagsInput = ({
|
||||||
|
classNames,
|
||||||
|
maxWidth,
|
||||||
|
variant = 'default',
|
||||||
|
width,
|
||||||
|
...props
|
||||||
|
}: TagsInputProps) => {
|
||||||
|
const mergedClassNames = useMemo(
|
||||||
|
() => (classNames ? { ...defaultClassNames, ...classNames } : defaultClassNames),
|
||||||
|
[classNames],
|
||||||
|
);
|
||||||
|
|
||||||
|
const style = useMemo(
|
||||||
|
() => (maxWidth || width ? { maxWidth, width } : undefined),
|
||||||
|
[maxWidth, width],
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MantineTagsInput
|
||||||
|
classNames={mergedClassNames}
|
||||||
|
clearButtonProps={defaultClearButtonProps}
|
||||||
|
style={style}
|
||||||
|
variant={variant}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
Vendored
+6
-1
@@ -1,7 +1,8 @@
|
|||||||
import { ActionIconSize, PillVariant } from '@mantine/core';
|
import { ActionIconSize, PillVariant, TagsInputVariant } from '@mantine/core';
|
||||||
|
|
||||||
type ExtendedActionIconSize = 'compact-md' | 'compact-sm' | 'compact-xs' | ActionIconSize;
|
type ExtendedActionIconSize = 'compact-md' | 'compact-sm' | 'compact-xs' | ActionIconSize;
|
||||||
type ExtendedPillVariant = 'outline' | PillVariant;
|
type ExtendedPillVariant = 'outline' | PillVariant;
|
||||||
|
type ExtendedTagsInputVariant = 'default' | 'filled' | TagsInputVariant;
|
||||||
|
|
||||||
declare module '@mantine/core' {
|
declare module '@mantine/core' {
|
||||||
export interface ActionIconProps {
|
export interface ActionIconProps {
|
||||||
@@ -11,4 +12,8 @@ declare module '@mantine/core' {
|
|||||||
export interface PillProps {
|
export interface PillProps {
|
||||||
variant?: ExtendedPillVariant;
|
variant?: ExtendedPillVariant;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface TagsInputProps {
|
||||||
|
variant?: ExtendedTagsInputVariant;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user