// Dependencies
import {
nsMerge,
capitalize,
optionsMenuStructure,
optionType,
cloudflareImageUrl,
} from 'shared/utils.mjs'
import { designs } from 'shared/config/designs.mjs'
import { examples } from 'site/components/design-examples.mjs'
// Hooks
import { useTranslation } from 'next-i18next'
import { useDesign } from 'site/hooks/use-design.mjs'
import { useContext, Fragment } from 'react'
// Context
import { ModalContext } from 'shared/context/modal-context.mjs'
// Components
import { ModalWrapper } from 'shared/components/wrappers/modal.mjs'
import { lineDrawings } from 'shared/components/designs/linedrawings/index.mjs'
import { ns as designNs } from 'shared/components/designs/design.mjs'
import { Difficulty } from 'shared/components/designs/difficulty.mjs'
import { PageLink, AnchorLink, Link } from 'shared/components/link.mjs'
import { DocsLink, DocsTitle } from 'shared/components/mdx/docs-helpers.mjs'
import { DynamicOrgDocs as DynamicDocs } from 'site/components/dynamic-org-docs.mjs'
import { Popout } from 'shared/components/popout/index.mjs'
import { NewPatternIcon } from 'shared/components/icons.mjs'
// Translation namespaces used on this page
export const ns = nsMerge(
designNs,
'account',
'tags',
'techniques',
'measurements',
'workbench',
'designs',
'tags'
)
const Option = ({ id, option, t, design }) =>
optionType(option) === 'constant' ? null : (
)
const OptionGroup = ({ id, group, t, design }) => (
{t(`workbench:${id}`)}
{Object.entries(group).map(([sid, entry]) =>
entry.isGroup ? (
) : (
)
)}
)
const SimpleOptionsList = ({ options, t, design }) => {
const structure = optionsMenuStructure(options, {})
const output = []
for (const [key, entry] of Object.entries(structure)) {
const shared = { key, t, design, id: key }
if (entry.isGroup) output.push()
else output.push()
}
return
}
export const DesignInfo = ({ design, docs = false, workbench = false }) => {
const { setModal } = useContext(ModalContext)
const { t, i18n } = useTranslation([...ns, design])
const { language } = i18n
const Design = useDesign(design)
const config = Design.patternConfig
// Translate measurements
const measies = { required: {}, optional: {} }
if (config?.measurements) {
for (const m of config.measurements) measies.required[m] = t(`measurements:${m}`)
}
if (config?.optionalMeasurements) {
for (const m of config.optionalMeasurements) measies.optional[m] = t(`measurements:${m}`)
}
// Linedrawing
const LineDrawing = lineDrawings[design]
? lineDrawings[design]
: ({ className }) =>
// Docs content
const docsContent = (
<>
{t('account:docs')}
>
)
return (
<>
#FreeSewing{capitalize(design)}
{t(`designs:${design}.d`)}
{workbench ? null : (
{t('tags:newThingPattern', { thing: capitalize(design) })}
)}
{docs || workbench ? null : (
Jump to:
t.split(':').pop().trim()}
/>
{examples &&
}
{['needs', 'fabric'].map((page) => (
t.split(':').pop().trim()}
/>
))}
)}
{docs ? null : (
<>
t.split(':').pop().trim()}
/>
>
)}
{docs ? docsContent : null}
{examples ? (
<>
{t('account:examples')}
{examples[design] ? (
{examples[design].map((ex) => (
))}
) : (
{t('account:noExamples')}
{t('account:noExamplesMsg')}
{t('account:showcaseNew')}
)}
>
) : null}
{docs
? null
: ['needs', 'fabric'].map((page) => (
t.split(':').pop().trim()}
/>
))}
{docs ? null : docsContent}
{t('account:specifications')}
{t('account:design')}
{designs[design].design.map((person) => (
- {person}
))}
{t('account:code')}
{designs[design].code.map((person) => (
- {person}
))}
{t('tags:difficulty')}
{t('tags:tags')}
{designs[design].tags.map((tag) => (
{t(`tags:${tag}`)}
))}
{t('techniques:techniques')}
{designs[design].techniques.map((tech) => (
{t(`techniques:${tech}`)}
))}
{Object.keys(measies.required).length > 0 ? (
<>
{t('account:requiredMeasurements')}
{Object.keys(measies.required)
.sort()
.map((m) => (
-
))}
>
) : null}
{Object.keys(measies.optional).length > 0 ? (
<>
{t('account:optionalMeasurements')}
{Object.keys(measies.optional)
.sort()
.map((m) => (
-
))}
>
) : null}
{t('account:designOptions')}
{t('account:parts')}
{config.draftOrder.map((part) => (
- {part}
))}
{Object.keys(config.plugins).length > 0 ? (
<>
{t('account:plugins')}
{Object.keys(config.plugins).map((plugin) => (
- {plugin}
))}
>
) : null}
>
)
}