import React, { useState } from 'react' import { CloseIcon } from '@freesewing/react/components/Icon' /* * Resist the urge to DRY this up by contructing classNames dynamically * as doing so will cause them to be dropped from the production bundle */ const types = { comment: { bg: 'tw:bg-success/5', border: 'tw:border-success', text: 'tw:text-success', }, error: { bg: 'tw:bg-error/5', border: 'tw:border-error', text: 'tw:text-error', }, fixme: { bg: 'tw:bg-neutral/5', border: 'tw:border-neutral', text: 'tw:text-error', }, link: { bg: 'tw:bg-secondary/5', border: 'tw:border-secondary', text: 'tw:text-secondary', }, note: { bg: 'tw:bg-primary/5', border: 'tw:border-primary', text: 'tw:text-primary', }, related: { bg: 'tw:bg-info/5', border: 'tw:border-info', text: 'tw:text-info', }, tip: { bg: 'tw:bg-accent/5', border: 'tw:border-accent', text: 'tw:text-accent', }, warning: { bg: 'tw:bg-warning/5', border: 'tw:border-warning', text: 'tw:text-warning', }, } /** * This popout component is a way to make some content stand out * * @component * @param {object} props - All React props * @param {string} [props.by = false] - When type is comment, this will be used to show who made the comment * @param {JSX.Element} props.children - The component children, will be rendered if props.js is not set * @param {boolean} [props.compact = false] - Set this to render a compact style * @param {boolean} [props.dense = false] - Set this to render a dense style (only for compact view) * @param {boolean} [props.hideable = false] - Set this to make the popout hideable/dismissable * @param {string} [props.type = note] - One of the available types: comment, error, fixme, link, note, related, tip, warning * @param {string} [props.title = false] - Set this to use a custom title * @returns {JSX.Element} */ export const Popout = ({ by = false, children = null, compact = false, dense = false, hideable = false, type = 'note', title = false, }) => { // Make this hideable/dismissable const [hide, setHide] = useState(false) if (hide) return null return compact ? ( {children} ) : ( {children} ) } const RegularPopout = ({ by, children, hideable, type, title, setHide }) => (
{children}
{type === 'comment' && (
{by}
)}
) const CompactPopout = ({ by, children, compact, dense, hideable, type, title, setHide }) => (
{children}
) const PopoutTitle = ({ by, compact, hideable, setHide, title, type }) => (
{title ? title : types[type].title ? types[type].title : type.toUpperCase()} {compact ? | : null} {type === 'comment' && by && ( {' '} by {by} )}
{hideable && ( )}
)