From 8a4c558cee7fa221abb066e3bb787fc3edd286a8 Mon Sep 17 00:00:00 2001 From: Enoch Riese Date: Mon, 17 Jul 2023 11:40:45 -0500 Subject: [PATCH] more contained fixes to docs --- markdown/org/blog/2019-yearly-report/fr.md | 2 +- markdown/org/blog/a-call-for-help/nl.md | 4 +- markdown/org/blog/announcing-v2/uk.md | 4 +- .../blog/core-1-8-jaeger-across-back/de.md | 2 +- markdown/org/blog/email-spam-problems/uk.md | 2 +- .../org/blog/freesewing-goes-jamstack/de.md | 4 +- markdown/org/blog/freesewing-v2-1/fr.md | 2 +- markdown/org/blog/gdpr-plan/uk.md | 2 +- markdown/org/blog/roundup-2017-12/nl.md | 4 +- .../org/docs/designs/breanna/options/fr.md | 16 ++-- markdown/org/docs/designs/brian/options/fr.md | 16 ++-- .../org/docs/designs/hi/instructions/uk.md | 2 +- markdown/org/showcase/charlie-by-joost/nl.md | 2 +- sites/org/components/layouts/docs.mjs | 11 ++- sites/org/hooks/use-navigation.mjs | 63 +++++++++------- sites/org/pages/docs/[...slug].mjs | 51 +++---------- sites/org/pages/docs/index.mjs | 4 +- sites/shared/components/dynamic-docs/org.mjs | 58 +++++++-------- sites/shared/components/mdx/index.mjs | 13 +++- sites/shared/components/mdx/legend.mjs | 8 +- sites/shared/components/mdx/meta.mjs | 29 ++++---- sites/shared/components/mdx/read-more.mjs | 33 +++++---- .../shared/components/mdx/tabbed-example.mjs | 74 ++++++++++--------- .../shared/components/navigation/sitenav.mjs | 1 + sites/shared/components/prev-next.mjs | 2 + sites/shared/components/sets/set-picker.mjs | 2 +- .../workbench/menus/design-options/index.mjs | 2 +- sites/shared/components/wrappers/page.mjs | 17 ++--- 28 files changed, 213 insertions(+), 217 deletions(-) diff --git a/markdown/org/blog/2019-yearly-report/fr.md b/markdown/org/blog/2019-yearly-report/fr.md index ff2d00a083f..64b347f32c1 100644 --- a/markdown/org/blog/2019-yearly-report/fr.md +++ b/markdown/org/blog/2019-yearly-report/fr.md @@ -44,7 +44,7 @@ Nous cherchons également à embarquer plus de designers à bord de FreeSewing. Grâce à nos forrmidables mécènes, les revenus ont encore augmenté cette année. Comme vous le savez peut-être, FreeSewing fait don de 100 % de ses revenus à Medecins Sans Frontières/Doctors Sans Frontières. Donc, ce matin, j'ai eu le grand honneur de faire un chèque de 4109,38€ à [MSF](https://www.msf.org/). -Cela fait **vraiment du bien** alors merci à tous nos mécènes** pour leur soutien continu. Si vous souhaitez rejoindre ce groupe génial, [vous pouvez le faire ici](/patrons/join).

+Cela fait **vraiment du bien** alors merci à tous nos mécènes pour leur soutien continu. Si vous souhaitez rejoindre ce groupe génial, [vous pouvez le faire ici](/patrons/join). diff --git a/markdown/org/blog/a-call-for-help/nl.md b/markdown/org/blog/a-call-for-help/nl.md index cf6ad5ca012..f836a84e9a2 100644 --- a/markdown/org/blog/a-call-for-help/nl.md +++ b/markdown/org/blog/a-call-for-help/nl.md @@ -114,10 +114,10 @@ Je vertegenwoordigt FreeSewing in een niet-Engelse gemeenschap. Je kunt helpen v Je bent verantwoordelijk voor een specifiek FreeSewing ontwerp/patroon. Dan ben je *de persoon* om vragen te stellen over hoe je dat patroon maakt. Je zorgt ervoor dat de documentatie niet wordt vergeten. En je kan helpen met vragen of het triëren van probleemrapporten naar developers of ontwerpers. **Patroonontwerper -Je bedenkt nieuwe patronen voor FreeSewing. Je weet misschien niet eens hoe je een computer aanzet, maar je kan wel een verdomd goed bovenlijf tekenen.

+Je bedenkt nieuwe patronen voor FreeSewing. Je weet misschien niet eens hoe je een computer aanzet, maar je kan wel een verdomd goed bovenlijf tekenen. **Patroon Developer -Je programmeert nieuwe ontwerpen voor FreeSewing. Je weet misschien niet hoe je naaipatronen moet ontwerpen, maar je bent niet bang van Javascript en ziet het zitten om met een ontwerper samen aan een nieuw patroon te werken.

+Je programmeert nieuwe ontwerpen voor FreeSewing. Je weet misschien niet hoe je naaipatronen moet ontwerpen, maar je bent niet bang van Javascript en ziet het zitten om met een ontwerper samen aan een nieuw patroon te werken. **Proofreader** Je kijkt de originele Engelse tekst of de vertalingen na, op zoek naar typfouten en/of grammaticafouten. Je stelt verbeteringen voor en helpt de toon en schrijfstijl van de documentatie en geschreven tekst op FreeSewing consequent te houden. Je beheerst de taal die je nakijkt goed. diff --git a/markdown/org/blog/announcing-v2/uk.md b/markdown/org/blog/announcing-v2/uk.md index c52c05e487e..ebf7dabba4f 100644 --- a/markdown/org/blog/announcing-v2/uk.md +++ b/markdown/org/blog/announcing-v2/uk.md @@ -38,9 +38,7 @@ FreeSewing завжди мав репутацію видання викрійо Для тих, хто цікавиться розробкою патернів, ми оновили наш [підручник з розробки патернів](https://freesewing.dev/tutorial) , щоб ви могли розпочати роботу з нуля. -Є хороші новини і для перекладачів, адже тепер ми використовуємо [Crowdin](https://crowdin.com/) , який робить переклад легким і простим. Якщо ви хочете допомогти з перекладом, або, можливо, навіть додати нову мову до FreeSewing, обов'язково напишіть нам на - -.

+Є хороші новини і для перекладачів, адже тепер ми використовуємо [Crowdin](https://crowdin.com/) , який робить переклад легким і простим. Якщо ви хочете допомогти з перекладом, або, можливо, навіть додати нову мову до FreeSewing, обов'язково напишіть нам на. diff --git a/markdown/org/blog/core-1-8-jaeger-across-back/de.md b/markdown/org/blog/core-1-8-jaeger-across-back/de.md index 63c64b9cb25..c1ae49cd22f 100644 --- a/markdown/org/blog/core-1-8-jaeger-across-back/de.md +++ b/markdown/org/blog/core-1-8-jaeger-across-back/de.md @@ -55,7 +55,7 @@ Dies ist nicht der Fall *dieses Schnittmuster kommt mit 38 Optionen*. Als ob die Das Ersetzen einer Messung durch einen errechneten Wert, der auf der Grundlage einer anderen Messung generiert wird, mag dem entgegengesetzt erscheinen, aber es besteht kein Grund zur Sorge. Wir haben dafür gesorgt, dass Sie sich immer noch und die Passform am Rücken kümmern können. -Muster, die früher die *die Rückenbreite als Mass erforderten, haben nun eine neue erweiterte Option: den *Rückenfaktor*. Es erlaubt Ihnen, die Berechnung Ihrer Rückenbreite zu optimieren, stellt aber sicher, dass diese innerhalb sinnvoller Parameter bleibt.

+Muster, die früher die *die Rückenbreite als Mass erforderten, haben nun eine neue erweiterte Option: den *Rückenfaktor*. Es erlaubt Ihnen, die Berechnung Ihrer Rückenbreite zu optimieren, stellt aber sicher, dass diese innerhalb sinnvoller Parameter bleibt. ![Der Rückenbreitenfaktor](https://posts.freesewing.org/uploads/acrossback_60791a4392.png) diff --git a/markdown/org/blog/email-spam-problems/uk.md b/markdown/org/blog/email-spam-problems/uk.md index 218768f4896..b048e61248b 100644 --- a/markdown/org/blog/email-spam-problems/uk.md +++ b/markdown/org/blog/email-spam-problems/uk.md @@ -105,7 +105,7 @@ Microsoft - бегемот, а я просто хлопець. Я не можу Як ви вважаєте, чи використовують Gmail для розсилки спаму? Ти знаєш, що це так. Як ви думаєте, вони коли-небудь заблокують всю електронну пошту, що надходить з Gmail? Ти ж знаєш, що вони цього не зроблять. -Тож минулої ночі я впровадив деякі зміни, щоб вирішити цю проблему. Якщо ви маєте проблемну електронну адресу *, на додаток до звичайної електронної пошти, цей сайт надішле другий лист через Gmail.

+Тож минулої ночі я впровадив деякі зміни, щоб вирішити цю проблему. *Якщо ви маєте проблемну електронну адресу*, на додаток до звичайної електронної пошти, цей сайт надішле другий лист через Gmail. Я хотів би побачити, як вони це заблокують. diff --git a/markdown/org/blog/freesewing-goes-jamstack/de.md b/markdown/org/blog/freesewing-goes-jamstack/de.md index dbec453061e..cebc068e805 100644 --- a/markdown/org/blog/freesewing-goes-jamstack/de.md +++ b/markdown/org/blog/freesewing-goes-jamstack/de.md @@ -34,9 +34,7 @@ Ich wollte den gleichen Ansatz in einer Website. Außer, dass sie nicht statisch Ich habe zum ersten Mal von JAMstack erfahren, als ich anfing, mich mit dem Hosting für diese zentrale Dokumentationsseite zu befassen. Es wurde ursprünglich auf GitHub-Seiten gehostet, die kostenloses Hosting anbieten. Sie haben auch SSL oder einen benutzerdefinierten Domänennamen, aber Sie können nicht beides haben. Was eine Art Deal-Breaker war. -Auf der Suche nach Alternativen stolperte ich über [Netlify](https://www.netlify.com/), die sowohl SSL- als auch kundenspezifische Domains betreiben und ein kostenloses Angebot für Open-Source-Projekte haben (danke Jungs). Außerdem hat mich dieses Video von Netlify CEO Mathias Biilmann - - sehr begeistert für JAMstack.

+Auf der Suche nach Alternativen stolperte ich über [Netlify](https://www.netlify.com/), die sowohl SSL- als auch kundenspezifische Domains betreiben und ein kostenloses Angebot für Open-Source-Projekte haben (danke Jungs). Außerdem hat mich dieses Video von Netlify CEO Mathias Biilmann sehr begeistert für JAMstack. Sofern Sie nicht mit JAMstack vertraut sind, schlage ich vor, dass Sie sich das Video ansehen, aber es läuft darauf hinaus: diff --git a/markdown/org/blog/freesewing-v2-1/fr.md b/markdown/org/blog/freesewing-v2-1/fr.md index 7efca4077f0..3e4bf4c43aa 100644 --- a/markdown/org/blog/freesewing-v2-1/fr.md +++ b/markdown/org/blog/freesewing-v2-1/fr.md @@ -8,7 +8,7 @@ title: "FreeSewing v2.1 : Trois nouveaux modèles, un mode expert et l'aide aux --- -Nous venons juste de publier FreeSewing v2.1 🎉 +Nous venons juste de publier FreeSewing v2.1 🎉 ## Rencontrez Pénelope, Waralee et Simone diff --git a/markdown/org/blog/gdpr-plan/uk.md b/markdown/org/blog/gdpr-plan/uk.md index 3d36974a6f0..a31b8403e17 100644 --- a/markdown/org/blog/gdpr-plan/uk.md +++ b/markdown/org/blog/gdpr-plan/uk.md @@ -231,7 +231,7 @@ GDPR стверджує, що ви повинні запитувати згод Очевидно, що ЄС не прийде перевіряти ваш код, щоб побачити, чи взяли ви принцип приватності за задумом близько до серця. Але вона може (і, ймовірно, буде) впливати, коли щось піде не так. - Уявіть собі дві компанії, в яких стався витік даних, причому одна з них не зробила нічого, щоб захистити конфіденційність своїх користувачів, тоді як інша вжила *заходів для зменшення шкоди.

+Уявіть собі дві компанії, в яких стався витік даних, причому одна з них не зробила нічого, щоб захистити конфіденційність своїх користувачів, тоді як інша вжила *заходів для зменшення шкоди*. Очевидно, що ЄС буде жорсткіше ставитися до компаній, які навіть не намагалися. diff --git a/markdown/org/blog/roundup-2017-12/nl.md b/markdown/org/blog/roundup-2017-12/nl.md index 09319411f3b..ae0194bdfad 100644 --- a/markdown/org/blog/roundup-2017-12/nl.md +++ b/markdown/org/blog/roundup-2017-12/nl.md @@ -18,9 +18,7 @@ Wat verandert er? Ik ben blij dat je het vraagt: Dit was echt groot nieuws voor mij en iets waar we achter de schermen al een tijdje aan werkten. Maar 3 weken geleden onthulden we eindelijk ons nieuwe patronensysteem. - De blogpost - -voor de aankondiging bevat alle details, plus een openhartige blik op de financiële kant van dit project . Als je het nog niet gelezen hebt, raad ik het je aan.

+De blogpost voor de aankondiging bevat alle details, plus een openhartige blik op de financiële kant van dit project . Als je het nog niet gelezen hebt, raad ik het je aan. ![Informatie verspreiden over onze nieuwe mecenaatsbenadering](https://posts.freesewing.org/uploads/patrons_ig_bad479bb83.png) diff --git a/markdown/org/docs/designs/breanna/options/fr.md b/markdown/org/docs/designs/breanna/options/fr.md index dbe0d09d91f..e1dc4883128 100644 --- a/markdown/org/docs/designs/breanna/options/fr.md +++ b/markdown/org/docs/designs/breanna/options/fr.md @@ -86,14 +86,14 @@ Nous disposons maintenant de tous les points de départ et d'arrivée pour dessi For each of the anchor points (the ones marked in orange, not points 1 and 2) there is an option to control the spread upwards, and downwards: -- [Répartition de tête de manche vers le bas Q1](/docs/patterns/breanna/options/sleevecapq1spread1) : contrôle la répartition vers le bas dans le premier quadrant<0><0> -- [Répartition de tête de manche vers le haut Q1](/docs/patterns/breanna/options/sleevecapq1spread2) : contrôle la répartition vers le haut dans le premier quadrant<0><0> -- [Répartition de tête de manche vers le bas Q2](/docs/patterns/breanna/options/sleevecapq2spread1) : contrôle la répartition vers le bas dans le deuxième quadrant<0><0> -- [Répartition de tête de manche vers le haut Q2](/docs/patterns/breanna/options/sleevecapq2spread2) : contrôle la répartition vers le haut dans le deuxième quadrant<0><0> -- [Répartition de tête de manche vers le haut Q3](/docs/patterns/breanna/options/sleevecapq3spread1) : contrôle la répartition vers le haut dans le troisième quadrant<0><0> -- [Répartition de tête de manche vers le bas Q3](/docs/patterns/breanna/options/sleevecapq3spread2) : contrôle la répartition vers le bas dans le troisième quadrant<0><0> -- [Répartition de tête de manche vers le haut Q4](/docs/patterns/breanna/options/sleevecapq4spread1) : contrôle la répartition vers le haut dans le quatrième quadrant<0><0> -- [Répartition de tête de manche vers le bas Q4](/docs/patterns/breanna/options/sleevecapq4spread2) : contrôle la répartition vers le bas dans le quatrième quadrant<0><0> +- [Répartition de tête de manche vers le bas Q1](/docs/patterns/breanna/options/sleevecapq1spread1) : contrôle la répartition vers le bas dans le premier quadrant +- [Répartition de tête de manche vers le haut Q1](/docs/patterns/breanna/options/sleevecapq1spread2) : contrôle la répartition vers le haut dans le premier quadrant +- [Répartition de tête de manche vers le bas Q2](/docs/patterns/breanna/options/sleevecapq2spread1) : contrôle la répartition vers le bas dans le deuxième quadrant +- [Répartition de tête de manche vers le haut Q2](/docs/patterns/breanna/options/sleevecapq2spread2) : contrôle la répartition vers le haut dans le deuxième quadrant +- [Répartition de tête de manche vers le haut Q3](/docs/patterns/breanna/options/sleevecapq3spread1) : contrôle la répartition vers le haut dans le troisième quadrant +- [Répartition de tête de manche vers le bas Q3](/docs/patterns/breanna/options/sleevecapq3spread2) : contrôle la répartition vers le bas dans le troisième quadrant +- [Répartition de tête de manche vers le haut Q4](/docs/patterns/breanna/options/sleevecapq4spread1) : contrôle la répartition vers le haut dans le quatrième quadrant +- [Répartition de tête de manche vers le bas Q4](/docs/patterns/breanna/options/sleevecapq4spread2) : contrôle la répartition vers le bas dans le quatrième quadrant diff --git a/markdown/org/docs/designs/brian/options/fr.md b/markdown/org/docs/designs/brian/options/fr.md index 7c7e18a0b14..9d428d53304 100644 --- a/markdown/org/docs/designs/brian/options/fr.md +++ b/markdown/org/docs/designs/brian/options/fr.md @@ -86,14 +86,14 @@ Nous disposons maintenant de tous les points de départ et d'arrivée pour dessi For each of the anchor points (the ones marked in orange, not points 1 and 2) there is an option to control the spread upwards, and downwards: -- [Répartition de tête de manche vers le bas Q1](/docs/patterns/brian/options/sleevecapq1spread1) : contrôle la répartition vers le bas dans le premier quadrant<0><0> -- [Répartition de tête de manche vers le haut Q1](/docs/patterns/brian/options/sleevecapq1spread2) : contrôle la répartition vers le haut dans le premier quadrant<0><0> -- [Répartition de tête de manche vers le bas Q2](/docs/patterns/brian/options/sleevecapq2spread1) : contrôle la répartition vers le bas dans le deuxième quadrant<0><0> -- [Répartition de tête de manche vers le haut Q2](/docs/patterns/brian/options/sleevecapq2spread2) : contrôle la répartition vers le haut dans le deuxième quadrant<0><0> -- [Répartition de tête de manche vers le haut Q3](/docs/patterns/brian/options/sleevecapq3spread1) : contrôle la répartition vers le haut dans le troisième quadrant<0><0> -- [Répartition de tête de manche vers le bas Q3](/docs/patterns/brian/options/sleevecapq3spread2) : contrôle la répartition vers le bas dans le troisième quadrant<0><0> -- [Répartition de tête de manche vers le haut Q4](/docs/patterns/brian/options/sleevecapq4spread1) : contrôle la répartition vers le haut dans le quatrième quadrant<0><0> -- [Répartition de tête de manche vers le bas Q4](/docs/patterns/brian/options/sleevecapq4spread2) : contrôle la répartition vers le bas dans le quatrième quadrant<0><0> +- [Répartition de tête de manche vers le bas Q1](/docs/patterns/brian/options/sleevecapq1spread1) : contrôle la répartition vers le bas dans le premier quadrant +- [Répartition de tête de manche vers le haut Q1](/docs/patterns/brian/options/sleevecapq1spread2) : contrôle la répartition vers le haut dans le premier quadrant +- [Répartition de tête de manche vers le bas Q2](/docs/patterns/brian/options/sleevecapq2spread1) : contrôle la répartition vers le bas dans le deuxième quadrant +- [Répartition de tête de manche vers le haut Q2](/docs/patterns/brian/options/sleevecapq2spread2) : contrôle la répartition vers le haut dans le deuxième quadrant +- [Répartition de tête de manche vers le haut Q3](/docs/patterns/brian/options/sleevecapq3spread1) : contrôle la répartition vers le haut dans le troisième quadrant +- [Répartition de tête de manche vers le bas Q3](/docs/patterns/brian/options/sleevecapq3spread2) : contrôle la répartition vers le bas dans le troisième quadrant +- [Répartition de tête de manche vers le haut Q4](/docs/patterns/brian/options/sleevecapq4spread1) : contrôle la répartition vers le haut dans le quatrième quadrant +- [Répartition de tête de manche vers le bas Q4](/docs/patterns/brian/options/sleevecapq4spread2) : contrôle la répartition vers le bas dans le quatrième quadrant diff --git a/markdown/org/docs/designs/hi/instructions/uk.md b/markdown/org/docs/designs/hi/instructions/uk.md index 2a81edf309d..4fd37bcc70e 100644 --- a/markdown/org/docs/designs/hi/instructions/uk.md +++ b/markdown/org/docs/designs/hi/instructions/uk.md @@ -12,7 +12,7 @@ title: "Привіт акула: Інструкція з пошиття" - Виріжте шматки чорної тканини розміром з очі на частинах тіла. - Стабілізуйте тканину за допомогою невеликої кількості проміжного шару. -- Білою ниткою, вручну або машиною _прикріпіть зіниці до очей, як люверси. +- Білою ниткою, вручну або машиною _прикріпіть_ зіниці до очей, як люверси. diff --git a/markdown/org/showcase/charlie-by-joost/nl.md b/markdown/org/showcase/charlie-by-joost/nl.md index 570972bb813..1768dacec89 100644 --- a/markdown/org/showcase/charlie-by-joost/nl.md +++ b/markdown/org/showcase/charlie-by-joost/nl.md @@ -10,7 +10,7 @@ designs: --- -Joost maakte deze Charlie Chinos broek en de hele FreeSewing community viel meteen voor het ontwerp van de broek en de stof. Joost kon ons niet vertellen waar de stof vandaan kwam (het was uit zijn voorraad), maar *gaf een paar dagen later wel het Charlie patroon vrij.

+Joost maakte deze Charlie Chinos broek en de hele FreeSewing community viel meteen voor het ontwerp van de broek en de stof. Joost kon ons niet vertellen waar de stof vandaan kwam (het was uit zijn voorraad), maar *gaf* een paar dagen later wel het Charlie patroon vrij. Deze foto is van Joost, [@j__st op Twitter](https://twitter.com/j__st). Hij werd hier gepost met toestemming. diff --git a/sites/org/components/layouts/docs.mjs b/sites/org/components/layouts/docs.mjs index 3d7e0f38bbf..908459ec70a 100644 --- a/sites/org/components/layouts/docs.mjs +++ b/sites/org/components/layouts/docs.mjs @@ -8,12 +8,17 @@ import { BaseLayoutProse, BaseLayoutRight, } from 'shared/components/base-layout.mjs' -import { NavLinks, Breadcrumbs, MainSections } from 'shared/components/navigation/sitenav.mjs' +import { + NavLinks, + Breadcrumbs, + MainSections, + ns as navNs, +} from 'shared/components/navigation/sitenav.mjs' import { Toc } from 'shared/components/mdx/toc.mjs' import { MdxMetaData } from 'shared/components/mdx/meta.mjs' import { PrevNext } from 'shared/components/prev-next.mjs' -export const ns = [] //navNs +export const ns = [navNs] //navNs export const DocsLayout = ({ children = [], slug, frontmatter }) => { const { siteNav } = useNavigation({ ignoreControl: true }) @@ -36,7 +41,7 @@ export const DocsLayout = ({ children = [], slug, frontmatter }) => { - {frontmatter.title} - FreeSewing.org + {frontmatter.title + '- FreeSewing.org'} diff --git a/sites/org/hooks/use-navigation.mjs b/sites/org/hooks/use-navigation.mjs index e1f22275e69..ed43db48479 100644 --- a/sites/org/hooks/use-navigation.mjs +++ b/sites/org/hooks/use-navigation.mjs @@ -6,6 +6,7 @@ import { designs, tags } from 'shared/config/designs.mjs' import { objUpdate } from 'shared/utils.mjs' import { orderedSlugLut } from 'shared/hooks/use-navigation-helpers.mjs' import { useRouter } from 'next/router' +import { useMemo } from 'react' /* * prebuildNavvigation[locale] holds the navigation structure based on MDX content. @@ -87,7 +88,7 @@ const sitePages = (t = false, control = 99) => { m: 1, s: 'new', h: 1, - t: t('new'), + t: t('sections:new'), pattern: { t: t('patternNew'), s: 'new/pattern', @@ -178,34 +179,40 @@ export const useNavigation = (param = {}, extra = []) => { // We need the account if we want to take control into account const { account } = useAccount() - const siteNav = { - ...pbn[locale], - ...sitePages(t, ignoreControl ? undefined : account.control), - } - for (const [_path, _data] of extra) { - objUpdate(siteNav, _path, _data) - } + const control = ignoreControl ? undefined : account.control - // Apply some tweaks - siteNav.blog.m = 1 - siteNav.blog.n = 1 - siteNav.showcase.m = 1 - siteNav.showcase.n = 1 - siteNav.docs.m = 1 + const value = useMemo(() => { + const siteNav = { + ...pbn[locale], + ...sitePages(t, control), + } + for (const [_path, _data] of extra) { + objUpdate(siteNav, _path, _data) + } - // Set order on main sections - siteNav.designs.o = 10 - siteNav.docs.o = 20 - siteNav.blog.o = 30 - siteNav.showcase.o = 40 - siteNav.community.o = 50 - siteNav.patterns.o = 60 - siteNav.sets.o = 70 - siteNav.account.o = 80 - siteNav.new.o = 90 + // Apply some tweaks + siteNav.blog.m = 1 + siteNav.blog.n = 1 + siteNav.showcase.m = 1 + siteNav.showcase.n = 1 + siteNav.docs.m = 1 - return { - siteNav, // Site navigation - slugLut: orderedSlugLut(siteNav), // Slug lookup table - } + // Set order on main sections + siteNav.designs.o = 10 + siteNav.docs.o = 20 + siteNav.blog.o = 30 + siteNav.showcase.o = 40 + siteNav.community.o = 50 + siteNav.patterns.o = 60 + siteNav.sets.o = 70 + siteNav.account.o = 80 + siteNav.new.o = 90 + + return { + siteNav, // Site navigation + slugLut: orderedSlugLut(siteNav), // Slug lookup table + } + }, [locale, extra, control]) + + return value } diff --git a/sites/org/pages/docs/[...slug].mjs b/sites/org/pages/docs/[...slug].mjs index e4b149ad1f5..817b6b2dffd 100644 --- a/sites/org/pages/docs/[...slug].mjs +++ b/sites/org/pages/docs/[...slug].mjs @@ -6,13 +6,13 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import { useState, useEffect } from 'react' // Components import Head from 'next/head' -import { PageWrapper, ns } from 'shared/components/wrappers/page.mjs' +import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs' import { Spinner } from 'shared/components/spinner.mjs' import { components } from 'shared/components/mdx/index.mjs' import { MdxWrapper } from 'shared/components/wrappers/mdx.mjs' -import { Toc } from 'shared/components/mdx/toc.mjs' -import { DocsLayout } from 'site/components/layouts/docs.mjs' +import { DocsLayout, ns as layoutNs } from 'site/components/layouts/docs.mjs' +const ns = [...pageNs, layoutNs] /* * PLEASE READ THIS BEFORE YOU TRY TO REFACTOR THIS PAGE * @@ -40,42 +40,13 @@ export const Loading = () => ( ) -const HeadInfo = ({ frontmatter, locale, slug }) => ( - - - - - - - - - - - - - {frontmatter.title} - FreeSewing.org - -) - export const Page = ({ page, frontmatter, slug, locale, MDX }) => ( } + layout={(props) => } > - -
- {frontmatter.toc && frontmatter.toc.length > 0 && ( -
- -
- )} - {MDX} -
+ {MDX}
) @@ -87,7 +58,7 @@ const EnDocsPage = ({ page, slug }) => { /* Load MDX dynamically */ useEffect(() => { const loadMDX = async () => { - import(`../../../../markdown/org/${slug}/en.md`).then((mod) => { + import(`orgmarkdown/docs/${slug}/en.md`).then((mod) => { setFrontmatter(mod.frontmatter) const Component = mod.default setMDX() @@ -107,7 +78,7 @@ const FrDocsPage = ({ page, slug }) => { /* Load MDX dynamically */ useEffect(() => { const loadMDX = async () => { - import(`../../../../markdown/org/${slug}/fr.md`).then((mod) => { + import(`orgmarkdown/docs/${slug}/fr.md`).then((mod) => { setFrontmatter(mod.frontmatter) const Component = mod.default setMDX() @@ -127,7 +98,7 @@ const EsDocsPage = ({ page, slug }) => { /* Load MDX dynamically */ useEffect(() => { const loadMDX = async () => { - import(`../../../../markdown/org/${slug}/es.md`).then((mod) => { + import(`orgmarkdown/docs/${slug}/es.md`).then((mod) => { setFrontmatter(mod.frontmatter) const Component = mod.default setMDX() @@ -147,7 +118,7 @@ const DeDocsPage = ({ page, slug }) => { /* Load MDX dynamically */ useEffect(() => { const loadMDX = async () => { - import(`../../../../markdown/org/${slug}/de.md`).then((mod) => { + import(`orgmarkdown/docs/${slug}/de.md`).then((mod) => { setFrontmatter(mod.frontmatter) const Component = mod.default setMDX() @@ -167,7 +138,7 @@ const NlDocsPage = ({ page, slug }) => { /* Load MDX dynamically */ useEffect(() => { const loadMDX = async () => { - import(`../../../../markdown/org/${slug}/nl.md`).then((mod) => { + import(`orgmarkdown/docs/${slug}/nl.md`).then((mod) => { setFrontmatter(mod.frontmatter) const Component = mod.default setMDX() @@ -197,7 +168,7 @@ export async function getStaticProps({ locale, params }) { return { props: { ...(await serverSideTranslations('en', ['docs', ...ns])), - slug: 'docs/' + params.slug.join('/'), + slug: params.slug.join('/'), locale, page: { locale, diff --git a/sites/org/pages/docs/index.mjs b/sites/org/pages/docs/index.mjs index 22fcdf187a0..6b7347e76e5 100644 --- a/sites/org/pages/docs/index.mjs +++ b/sites/org/pages/docs/index.mjs @@ -16,7 +16,9 @@ const DocsHomePage = ({ page, slug, locale }) => { /* Load MDX dynamically */ useEffect(() => { const loadMDX = async () => { - import(`../../../../markdown/org/docs/${locale}.md`).then((mod) => { + import( + /* webpackInclude: /docs\/\w+\.md/ */ `../../../../markdown/org/docs/${locale}.md` + ).then((mod) => { setFrontmatter(mod.frontmatter) const Component = mod.default setMDX() diff --git a/sites/shared/components/dynamic-docs/org.mjs b/sites/shared/components/dynamic-docs/org.mjs index 0f5e479bb71..078eacd54cb 100644 --- a/sites/shared/components/dynamic-docs/org.mjs +++ b/sites/shared/components/dynamic-docs/org.mjs @@ -4,6 +4,14 @@ import { Spinner } from 'shared/components/spinner.mjs' import { MdxWrapper } from './wrapper.mjs' import { components } from 'shared/components/mdx/index.mjs' +export const loaders = { + en: (path) => import(`orgmarkdown/docs/${path}/en.md`), + de: (path) => import(`orgmarkdown/docs/${path}/de.md`), + fr: (path) => import(`orgmarkdown/docs/${path}/fr.md`), + es: (path) => import(`orgmarkdown/docs/${path}/es.md`), + nl: (path) => import(`orgmarkdown/docs/${path}/nl.md`), + uk: (path) => import(`orgmarkdown/docs/${path}/uk.md`), +} /* * Webpack will check on disk for all possible files matching this * dynamic import. So unless we divide it up a bit your computer @@ -11,44 +19,30 @@ import { components } from 'shared/components/mdx/index.mjs' * * This will return a language-specific component */ -const dynamicDocsFactory = (lang) => { - return function DynamicDocs({ path }) { - const [frontmatter, setFrontmatter] = useState({}) - const mdx = dynamic( - () => - import(`orgmarkdown/docs/${path}/${lang}.md`).then((mod) => { - setFrontmatter(mod.frontmatter) - return mod - }), - { ssr: false } - ) - const MDX = mdx ? mdx : - return ( - - - - ) - } +function DynamicDocs({ path, lang }) { + const [frontmatter, setFrontmatter] = useState({}) + const mdx = dynamic( + () => + loaders[lang](path).then((mod) => { + setFrontmatter(mod.frontmatter) + return mod + }), + { ssr: false } + ) + const MDX = mdx ? mdx : + + return ( + + + + ) } -/* - * Instantiate language-specific components - */ -const OrgDocsEn = dynamicDocsFactory('en') -const OrgDocsDe = dynamicDocsFactory('de') -const OrgDocsFr = dynamicDocsFactory('fr') -const OrgDocsEs = dynamicDocsFactory('es') -const OrgDocsNl = dynamicDocsFactory('nl') - /* * Return language-specific component */ export const DynamicOrgDocs = ({ path = false, language = 'en' }) => { if (!path) return null - if (language === 'en') return - if (language === 'de') return - if (language === 'es') return - if (language === 'fr') return - if (language === 'nl') return + return } diff --git a/sites/shared/components/mdx/index.mjs b/sites/shared/components/mdx/index.mjs index b7a66fffc0b..598fc464775 100644 --- a/sites/shared/components/mdx/index.mjs +++ b/sites/shared/components/mdx/index.mjs @@ -11,6 +11,13 @@ import { Legend } from './legend.mjs' import { DocsTitle, DocsLink } from './docs-helpers.mjs' import { V3Wip } from '../v3-wip.mjs' +const WipWithReadMore = (props) => ( + <> + + + +) + export const components = (site = 'org') => { const base = { // Custom components @@ -48,9 +55,9 @@ export const components = (site = 'org') => { } : { ...base, - PatternDocs: V3Wip, - PatternOptions: V3Wip, - PatternMeasurements: V3Wip, + PatternDocs: WipWithReadMore, + PatternOptions: WipWithReadMore, + PatternMeasurements: WipWithReadMore, Gauge: V3Wip, Legend, } diff --git a/sites/shared/components/mdx/legend.mjs b/sites/shared/components/mdx/legend.mjs index 6b813983088..8456e0567ef 100644 --- a/sites/shared/components/mdx/legend.mjs +++ b/sites/shared/components/mdx/legend.mjs @@ -8,7 +8,13 @@ export const Legend = ({ caption = false, part = '', children = null }) => { head: 370, }, } - const patternProps = new LegendDesign(settings).draft().getRenderProps() + const pattern = new LegendDesign(settings).draft() + + const patternProps = { + renderProps: pattern.getRenderProps(), + logs: pattern.getLogs(), + } + if (caption) console.log( 'Passing the caption prop to @freesewing/components/Legend is deprecated. See: https://github.com/freesewing/freesewing/issues/1043' diff --git a/sites/shared/components/mdx/meta.mjs b/sites/shared/components/mdx/meta.mjs index bbbfa2300f5..4ad0d36c2e8 100644 --- a/sites/shared/components/mdx/meta.mjs +++ b/sites/shared/components/mdx/meta.mjs @@ -27,23 +27,24 @@ export const TimeAgo = ({ date, t }) => { return `${ago} ${t('ago')}` } -const PersonList = ({ list }) => ( -
    - {list.map((id) => ( -
  • - {allAuthors[id] ? ( - - ) : ( - {id} - )} -
  • - ))} -
-) +const PersonList = ({ list }) => + list ? ( +
    + {list.map((id) => ( +
  • + {allAuthors[id] ? ( + + ) : ( + {id} + )} +
  • + ))} +
+ ) : null const CreditsList = ({ updates, frontmatter, locale, t }) => (
    - {updates.a.length > 0 ? ( + {updates.a?.length > 0 ? (
  • {t('authors')}: diff --git a/sites/shared/components/mdx/read-more.mjs b/sites/shared/components/mdx/read-more.mjs index 6e32a32b8d1..f443185be65 100644 --- a/sites/shared/components/mdx/read-more.mjs +++ b/sites/shared/components/mdx/read-more.mjs @@ -5,6 +5,7 @@ import { NavigationContext } from 'shared/context/navigation-context.mjs' import { useNavigation } from 'site/hooks/use-navigation.mjs' import { BulletIcon, RightIcon } from 'shared/components/icons.mjs' import { pageHasChildren } from 'shared/utils.mjs' +import orderBy from 'lodash.orderby' export const getRoot = { dev: (root, nav) => { @@ -23,17 +24,20 @@ export const getRoot = { /* * This is a recursive function, so it needs to be lean */ -const RenderTree = ({ tree, recurse, depth = 1, level = 0 }) => ( -
      - {Object.keys(tree) - .filter((key) => key.length > 1) - .map((key, i) => { +const RenderTree = ({ tree, recurse, depth = 1, level = 0 }) => { + const orderedTree = orderBy(tree, ['o', 't'], ['asc', 'asc']).filter( + (item) => typeof item === 'object' + ) + + return ( +
        + {orderedTree.map((item, i) => { /* * Does this have children? */ const hasChildren = - recurse && (!depth || level < depth) && pageHasChildren(tree[key]) - ? tree[key].s.replaceAll('/', '') + recurse && (!depth || level < depth) && pageHasChildren(item) + ? item.s.replaceAll('/', '') : false /* @@ -47,23 +51,24 @@ const RenderTree = ({ tree, recurse, depth = 1, level = 0 }) => (
        - {tree[key].t} + {item.t} - +
        ) : ( <> - - {tree[key].t} + + {item.t} )} ) })} -
      -) +
    + ) +} export const ReadMore = ({ recurse = 0, @@ -86,5 +91,7 @@ export const ReadMore = ({ const tree = root === false ? getRoot[site](slug, siteNav) : getRoot[site](root, siteNav) + if (!tree) return null + return } diff --git a/sites/shared/components/mdx/tabbed-example.mjs b/sites/shared/components/mdx/tabbed-example.mjs index 262ab82e425..0dde9c954ae 100644 --- a/sites/shared/components/mdx/tabbed-example.mjs +++ b/sites/shared/components/mdx/tabbed-example.mjs @@ -81,6 +81,7 @@ export const TabbedExample = ({ withHead, paperless, settings, + patternProps, }) => { if (settings) settings = { @@ -89,49 +90,50 @@ export const TabbedExample = ({ } else settings = { margin: 5 } if (withHead) settings.measurements = { head: 300 } - const pattern = buildPattern(children, settings, tutorial, paperless) - // Check that it's a valid pattern - if (!pattern.sample) return null + if (children && !patternProps) { + const pattern = buildPattern(children, settings, tutorial, paperless) - const patternProps = { - renderProps: settings.sample - ? pattern.sample().getRenderProps() - : pattern.draft().getRenderProps(), - logs: pattern.getLogs(), + // Check that it's a valid pattern + if (!pattern.sample) return null + + patternProps = { + renderProps: settings.sample + ? pattern.sample().getRenderProps() + : pattern.draft().getRenderProps(), + logs: pattern.getLogs(), + } } - if (tutorial && !previewFirst) - return ( -
    - - {children} - - - - - - - - {caption && ( -
    - {caption} -
    - )} -
    - ) + const tabs = [] + const tabNames = ['Preview'] + tabs.push( + + + + ) + if (children) { + const codeTab = {children} + + if (tutorial && !previewFirst) { + tabs.unshift(codeTab) + tabNames.unshift('Code') + } else { + tabs.push(codeTab) + tabNames.push('Code') + } + } + + tabs.push( + + + + ) + tabNames.push('X-Ray') return (
    - - - - - {children} - - - - + {tabs} {caption && (
    {caption} diff --git a/sites/shared/components/navigation/sitenav.mjs b/sites/shared/components/navigation/sitenav.mjs index 124bbd8416c..17d7130627d 100644 --- a/sites/shared/components/navigation/sitenav.mjs +++ b/sites/shared/components/navigation/sitenav.mjs @@ -7,6 +7,7 @@ import orderBy from 'lodash.orderby' import { icons } from 'shared/components/navigation/primary.mjs' import { useTranslation } from 'next-i18next' +export const ns = ['sections'] /* * This returns only those children that are expected to show up * in the side navigation. Specifically: diff --git a/sites/shared/components/prev-next.mjs b/sites/shared/components/prev-next.mjs index 50139cc48fd..bc4051b111b 100644 --- a/sites/shared/components/prev-next.mjs +++ b/sites/shared/components/prev-next.mjs @@ -38,6 +38,8 @@ export const PrevNext = ({ slug, noPrev = false }) => { // Lookup the current slug in the LUT const index = slugLut.indexOf(slug) + if (index < 0) return null + // Add 1 for the next page, unless it's the last page const iNext = index === slugLut.length - 1 ? 0 : index + 1 diff --git a/sites/shared/components/sets/set-picker.mjs b/sites/shared/components/sets/set-picker.mjs index bc844d95d84..c44e16aa60f 100644 --- a/sites/shared/components/sets/set-picker.mjs +++ b/sites/shared/components/sets/set-picker.mjs @@ -61,7 +61,7 @@ export const CuratedSetPicker = ({ design, language, href, clickHandler }) => { const setTags = [] for (const lang of siteConfig.languages) { const key = `tags${capitalize(lang)}` - setTags.push(...set[key]) + if (set[key]) setTags.push(...set[key]) } let match = 0 for (const tag of filter) { diff --git a/sites/shared/components/workbench/menus/design-options/index.mjs b/sites/shared/components/workbench/menus/design-options/index.mjs index 6829d5707dd..b2836f4292f 100644 --- a/sites/shared/components/workbench/menus/design-options/index.mjs +++ b/sites/shared/components/workbench/menus/design-options/index.mjs @@ -73,7 +73,7 @@ export const DesignOptions = ({ const menuNs = [`o_${design}`, ...ns] const optionsMenu = optionsMenuStructure(patternConfig.options) const getDocsPath = (option) => - `patterns/${design}/options${option ? '/' + option.toLowerCase() : ''}` + `designs/${design}/options${option ? '/' + option.toLowerCase() : ''}` return ( { * Update navigation context with title and path */ useEffect(() => { - // Only update if a new page was loaded - if (path.join('/') !== slug) { - setNavigation({ - title: pageTitle, - locale, - path, - }) - setNavupdates(navupdates + 1) - } - }, [path, pageTitle, slug, locale, navupdates, setNavigation]) + setNavigation({ + title: pageTitle, + locale, + path, + }) + setNavupdates((curState) => curState + 1) + }, [path, pageTitle, locale, setNavupdates, setNavigation]) /* * Hotkeys (keyboard actions)