diff --git a/packages/react/components/Popout/index.mjs b/packages/react/components/Popout/index.mjs index 42bf67bf1ba..bb8583503a7 100644 --- a/packages/react/components/Popout/index.mjs +++ b/packages/react/components/Popout/index.mjs @@ -1,108 +1,141 @@ import React, { useState } from 'react' import { CloseIcon } from '@freesewing/react/components/Icon' -const colors = { - comment: 'secondary', - error: 'error', - fixme: 'warning', - link: 'secondary', - none: '', - note: 'primary', - related: 'info', - tip: 'accent', - tldr: 'info', - warning: 'error', +/* + * 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 {object} props.comment - Set this to make it a comment popout - * @param {object} props.error - Set this to make it a error popout - * @param {object} props.fixme - Set this to make it a fixme popout - * @param {object} props.link - Set this to make it a link popout - * @param {object} props.note - Set this to make it a note popout - * @param {object} props.related - Set this to make it a related popout - * @param {object} props.tip - Set this to make it a tip popout - * @param {object} props.tldr - Set this to make it a tldr popout - * @param {object} props.warning - Set this to make it a warning popout - * @param {string} props.title - The popout title - * @param {string} noP - Do not wrap the content in a p tag + * @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 = (props) => { +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 - let type = 'none' - for (const c in colors) { - if (props[c]) type = c - } - const color = colors[type] - const { className = '' } = props - - return props.compact ? ( -
-
-
- {props.title || ( - <> - {type.toUpperCase()} - | - - )} -
-
{props.noP ? props.children :

{props.children}

}
-
-
- ) : ( -
-
-
-
- - {props.title ? props.title : type === 'tldr' ? 'TL;DR' : type.toUpperCase()} - - - {type === 'tw:comment' && ( - <> - {' '} - by {props.by} - - )} - -
- {props.hideable && ( - - )} -
-
{props.children}
- {type === 'comment' && ( -
{props.by}
- )} -
-
- ) + return compact + ? {children} + : {children} } + +const RegularPopout = ({ by, children, compact, 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 && ( + + )} +
+) diff --git a/packages/react/mkdocs.sh b/packages/react/mkdocs.sh index dbed94c6b74..b690ada8114 100755 --- a/packages/react/mkdocs.sh +++ b/packages/react/mkdocs.sh @@ -29,3 +29,4 @@ jsdoc -c jsdoc.json components/Null/* > ../../sites/dev/prebuild/jsdoc/react/com jsdoc -c jsdoc.json components/Number/* > ../../sites/dev/prebuild/jsdoc/react/components/number.json jsdoc -c jsdoc.json components/Patrons/* > ../../sites/dev/prebuild/jsdoc/react/components/patrons.json jsdoc -c jsdoc.json components/Pattern/* > ../../sites/dev/prebuild/jsdoc/react/components/pattern.json +jsdoc -c jsdoc.json components/Popout/* > ../../sites/dev/prebuild/jsdoc/react/components/popout.json diff --git a/sites/dev/docs/reference/packages/react/components/popout/_examples.js b/sites/dev/docs/reference/packages/react/components/popout/_examples.js new file mode 100644 index 00000000000..2f1191edab6 --- /dev/null +++ b/sites/dev/docs/reference/packages/react/components/popout/_examples.js @@ -0,0 +1,18 @@ +import React from 'react' +import { Popout } from '@freesewing/react/components/Popout' + +const types = [ 'comment', 'error', 'fixme', 'link', 'note', 'related', 'tip', 'warning' ] + +export const PopoutExample = () => ( + <> + {types.map(type => This is a {type})} + {types.map(type => This is a {type} with a custom title)} + {types.map(type => This is a compact {type})} + {types.map(type => This is a compact {type} with a custom title)} + {types.map(type => This is a compact & dense {type})} + This is a comment with a by prop to indicate the author + This is a compact comment with a by prop to indicate the author + This is a compact & dense comment with a by prop to indicate the author + This is a hideable tip + +) diff --git a/sites/dev/docs/reference/packages/react/components/popout/readme.mdx b/sites/dev/docs/reference/packages/react/components/popout/readme.mdx index c3a6537e1bb..5656ab7cd87 100644 --- a/sites/dev/docs/reference/packages/react/components/popout/readme.mdx +++ b/sites/dev/docs/reference/packages/react/components/popout/readme.mdx @@ -2,6 +2,23 @@ title: Popout --- -:::note -This page is yet to be created -::: +import { DocusaurusDoc } from '@freesewing/react/components/Docusaurus' +import { ComponentDocs } from '@site/src/components/component-docs.js' +import * as jsdoc from '@site/prebuild/jsdoc/components.popout.mjs' +import { PopoutExample } from './_examples.js' + + + +- [Components](#components) + +## Components + +The **Popout** component family provides the following components: + +- [Popout](#popout) + +### Popout + + + +