diff --git a/packages/react/components/Button/index.mjs b/packages/react/components/Button/index.mjs index 69627c890a7..0db331bf7ad 100644 --- a/packages/react/components/Button/index.mjs +++ b/packages/react/components/Button/index.mjs @@ -3,7 +3,7 @@ import { copyToClipboard } from '@freesewing/utils' import { CopyIcon, OkIcon } from '@freesewing/react/components/Icon' import { LoadingStatusContext } from '@freesewing/react/context/LoadingStatus' -const handleCopied = (content, setCopied, setLoadingStatus, label) => { +const handleCopied = (content, setCopied, setLoadingStatus, label, handler=false) => { copyToClipboard(content) setCopied(true) setLoadingStatus([ @@ -13,6 +13,7 @@ const handleCopied = (content, setCopied, setLoadingStatus, label) => { true, ]) setTimeout(() => setCopied(false), 1000) + if (typeof handler === 'function') handler(content, label) } /** @@ -21,12 +22,14 @@ const handleCopied = (content, setCopied, setLoadingStatus, label) => { * @component * @param {object} props - All component props * @param {JSX.element} props.children - The component children + * @param {string} [props.btnClasses = 'tw:daisy-btn tw:daisy-btn-ghost tw:hover:border-transparent w:hover:border-transparent tw:hover:shadow-none'] - The content that should be copied to the clipboard * @param {string} props.content - The content that should be copied to the clipboard * @param {string} props.label - The label to show when the content is copied + * @param {function} [props.onCopy=false] - An optional handler to call after copying to the clipboard, receives content, label as parameters * @param {boolean} props.sup - Set this to true to render as superscript (above the line) * @returns {JSX.Element} */ -export const CopyToClipboardButton = ({ children, content, label = false, sup = false }) => { +export const CopyToClipboardButton = ({ children, content, label = false, sup = false, btnClasses="tw:daisy-btn tw:daisy-btn-ghost tw:hover:border-transparent w:hover:border-transparent tw:hover:shadow-none", onCopy=false }) => { const [copied, setCopied] = useState(false) const { setLoadingStatus } = useContext(LoadingStatusContext) @@ -36,9 +39,10 @@ export const CopyToClipboardButton = ({ children, content, label = false, sup = ) @@ -528,7 +530,7 @@ export const HeaderMenuButton = ({ }) => ( ) @@ -100,7 +100,7 @@ const SampleMeasurementButton = ({ name, update }) => ( } onClick={() => update.settings('sample', { type: 'measurement', measurement: name })} > - + {measurementsTranslations[name]} ) diff --git a/packages/react/components/Editor/components/views/DocsView.mjs b/packages/react/components/Editor/components/views/DocsView.mjs index b0e4c26d2ce..2f2b70d7ce1 100644 --- a/packages/react/components/Editor/components/views/DocsView.mjs +++ b/packages/react/components/Editor/components/views/DocsView.mjs @@ -1,11 +1,15 @@ // Dependencies import { linkClasses, capitalize } from '@freesewing/utils' +// Context +import { ModalContext } from '@freesewing/react/context/Modal' // Hooks -import React from 'react' +import React, { useContext } from 'react' // Components -import { H1, H5 } from '@freesewing/react/components/Heading' -import { Popout } from '@freesewing/react/components/Popout' +import { H1, H2 } from '@freesewing/react/components/Heading' +import { modalDocsHelp } from '@freesewing/react/components/Help' import { HeaderMenu } from '../HeaderMenu.mjs' +import { Popout } from '@freesewing/react/components/Popout' + /** * This is the docs view, it just shows content @@ -16,51 +20,51 @@ import { HeaderMenu } from '../HeaderMenu.mjs' * @param {Object} props.update - Helper object for updating the editor state */ export const DocsView = ({ state, config, update }) => { + const { setModal, modalContent } = useContext(ModalContext) + return ( <>

Documentation

{state?.design ? ( - -
Design Documentation
-

- You can find documentation for the {capitalize(state.design)} design at: -
- + <> +

Design Documentation

+ + +
+ + ) : null} - -
Understanding the FreeSewing Pattern Editor
-

- Please refer to the pattern editor documentation at: -
- - {`FreeSewing.eu/docs/about/editor`} - -

+

Editor Documentation

+ + - -
- Looking for info on how it really works? -
-

- Documentation for developers and contributors is available at{' '} - - {`FreeSewing.dev`} - -

+ +

Developer Documentation

+ + + {`FreeSewing.dev`} +
+ {modalContent} ) } diff --git a/packages/react/components/Editor/components/views/ExportView.mjs b/packages/react/components/Editor/components/views/ExportView.mjs index b2cc5aec886..0dfc2bc07bd 100644 --- a/packages/react/components/Editor/components/views/ExportView.mjs +++ b/packages/react/components/Editor/components/views/ExportView.mjs @@ -58,10 +58,26 @@ export const ExportView = (props) => {

Share your pattern

If you merely want to share your pattern with others, you can copy these URLs:

- + { + console.log('handler called') + update.notifySuccess('Pattern and Measurements URL copied to clipboard') + }} + > Pattern and Measurements - + { + console.log('handler called') + update.notifySuccess('Pattern URL copied to clipboard') + }} + > Pattern only
diff --git a/packages/react/components/Editor/components/views/SaveView.mjs b/packages/react/components/Editor/components/views/SaveView.mjs index bc3107ddc17..402e782a02a 100644 --- a/packages/react/components/Editor/components/views/SaveView.mjs +++ b/packages/react/components/Editor/components/views/SaveView.mjs @@ -162,7 +162,7 @@ export const SaveView = ({ config, state, update }) => { To access your saved patterns, go to: {' '} - /account/patterns + /account/data/patterns

diff --git a/packages/react/components/Editor/components/views/TestView.mjs b/packages/react/components/Editor/components/views/TestView.mjs index 8ad75cd6687..d15a8150628 100644 --- a/packages/react/components/Editor/components/views/TestView.mjs +++ b/packages/react/components/Editor/components/views/TestView.mjs @@ -14,6 +14,7 @@ import { ZoomablePattern } from '../ZoomablePattern.mjs' import { PatternLayout } from '../PatternLayout.mjs' import { HeaderMenu } from '../HeaderMenu.mjs' import { H1, H3, H4, H5 } from '@freesewing/react/components/Heading' +import { OptionsIcon, MeasurementsIcon } from '@freesewing/react/components/Icon' /** * The test view allows users to test options and measurements @@ -87,6 +88,7 @@ export const TestView = ({ Design, state, update, config }) => { 't', 'ASC' ) + const btnClasses = "tw:my-0.5 tw:block tw:daisy-btn tw:daisy-btn-primary tw:daisy-btn-outline tw:daisy-btn-xs tw:flex tw:flex-row tw:items-center tw:justify-between tw:w-full tw:max-w-64" return ( <> @@ -106,12 +108,13 @@ export const TestView = ({ Design, state, update, config }) => { {trm.map(({ t, m }) => ( ))} @@ -122,12 +125,13 @@ export const TestView = ({ Design, state, update, config }) => { {tom.map(({ t, m }) => ( ))} @@ -158,6 +162,7 @@ const SampleOptionsMenu = ({ Design, state, update }) => { const SampleOptionsSubMenu = ({ structure, update, level = 1 }) => { const output = [] + const btnClasses = "tw:my-0.5 tw:block tw:daisy-btn tw:daisy-btn-primary tw:daisy-btn-outline tw:daisy-btn-xs tw:flex tw:flex-row tw:items-center tw:justify-between tw:w-full tw:max-w-64" /* * Show entries alphabetic, but force groups last, and advanced last among them */ @@ -175,10 +180,11 @@ const SampleOptionsSubMenu = ({ structure, update, level = 1 }) => { output.push( ) } diff --git a/packages/react/components/Editor/components/views/UndosView.mjs b/packages/react/components/Editor/components/views/UndosView.mjs index f3df9384c0f..0f05492b7e8 100644 --- a/packages/react/components/Editor/components/views/UndosView.mjs +++ b/packages/react/components/Editor/components/views/UndosView.mjs @@ -108,33 +108,33 @@ export const UndoStep = ({ update, state, step, Design, compact = false, index = return ( <> -

- -

update.restore(index, state._)}> -
- - {data.fieldIcon || null} - {data.title} - - - {data.icon || null} {data.menu} - -
-
- {data.msg ? ( - data.msg - ) : ( - <> - - {Array.isArray(data.newVal) ? data.newVal.join(', ') : data.newVal} - - - - {Array.isArray(data.oldVal) ? data.oldVal.join(', ') : data.oldVal} - - - )} +
+
+
+ + {data.menu} + + » + + {data.title} + +
+
+ {data.msg ? ( + data.msg + ) : ( + <> + + {Array.isArray(data.newVal) ? data.newVal.join(', ') : data.newVal} + + + + {Array.isArray(data.oldVal) ? data.oldVal.join(', ') : data.oldVal} + + + )} +
diff --git a/packages/react/components/Help/index.mjs b/packages/react/components/Help/index.mjs index 951c6e321b5..7ea5c950dcd 100644 --- a/packages/react/components/Help/index.mjs +++ b/packages/react/components/Help/index.mjs @@ -2,7 +2,26 @@ import React from 'react' // Components import { ModalWrapper } from '@freesewing/react/components/Modal' -const Iframe = (props) =>