diff options
Diffstat (limited to 'src/components/ErrorMessage.tsx')
-rw-r--r-- | src/components/ErrorMessage.tsx | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/components/ErrorMessage.tsx b/src/components/ErrorMessage.tsx index 650100d..6151603 100644 --- a/src/components/ErrorMessage.tsx +++ b/src/components/ErrorMessage.tsx @@ -1,10 +1,11 @@ /** @jsx jsx */ -import { jsx, css } from "@emotion/react"; +import {jsx, css} from "@emotion/react"; import colors from "../colors"; +import {selectable} from "../commonStyles"; interface ErrorMessageProps { show: boolean, - message: string + content: string | JSX.Element, } export default function ErrorMessage(props: ErrorMessageProps): JSX.Element | null { @@ -13,12 +14,23 @@ export default function ErrorMessage(props: ErrorMessageProps): JSX.Element | nu font-size: 1.15rem; line-height: 1.1rem; margin: 1rem 0 0; + visibility: ${props.show ? "visible" : "hidden"}; + opacity: ${props.show ? 1 : 0}; + transition: opacity 200ms, visibility 200ms; + `; + + // These styles are not applied when content is an element; + const floatingStyles = css` position: absolute; z-index: -1; `; + const isString = typeof props.content === "string"; + return ( - <p css={styles}>{props.message}</p> + <div tabIndex={-1} css={[styles, selectable, isString ? floatingStyles : null]}> + {props.content} + </div> ); } |