diff options
Diffstat (limited to 'src/components/atoms/forms/label/label.tsx')
| -rw-r--r-- | src/components/atoms/forms/label/label.tsx | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/components/atoms/forms/label/label.tsx b/src/components/atoms/forms/label/label.tsx new file mode 100644 index 0000000..5087325 --- /dev/null +++ b/src/components/atoms/forms/label/label.tsx @@ -0,0 +1,62 @@ +import { FC, LabelHTMLAttributes, ReactNode } from 'react'; +import styles from './label.module.scss'; + +export type LabelSize = 'md' | 'sm'; + +export type LabelProps = Omit< + LabelHTMLAttributes<HTMLLabelElement>, + 'hidden' | 'size' +> & { + /** + * The label body. + */ + children: ReactNode; + /** + * Should the label be hidden? + * + * @default false + */ + isHidden?: boolean; + /** + * Is the field required? + * + * @default false + */ + isRequired?: boolean; + /** + * The label size. + * + * @default 'sm' + */ + size?: LabelSize; +}; + +/** + * Label Component + * + * Render a HTML label element. + */ +export const Label: FC<LabelProps> = ({ + children, + className = '', + isHidden = false, + isRequired = false, + size = 'sm', + ...props +}) => { + const visibilityClass = isHidden ? 'screen-reader-text' : ''; + const sizeClass = styles[`label--${size}`]; + const labelClass = `${styles.label} ${sizeClass} ${visibilityClass} ${className}`; + const requiredSymbol = ' *'; + + return ( + <label {...props} className={labelClass}> + {children} + {isRequired ? ( + <span aria-hidden className={styles.required}> + {requiredSymbol} + </span> + ) : null} + </label> + ); +}; |
